Passe objeto por referência em C#

Muhammad Maisam Abbas 12 outubro 2023
  1. Passe variáveis ​​por valor para uma função em C#
  2. Passe variáveis ​​por referência a uma função em C#
  3. Passe objetos por referência a uma função em C#
Passe objeto por referência em C#

Este tutorial discutirá os métodos de transmissão de um objeto para uma função em C#.

Passe variáveis ​​por valor para uma função em C#

Todas as variáveis ​​de tipo de valor são passadas por valor por padrão em C#. Suponha que passemos uma variável por valor para uma função e modifiquemos essa variável na função. Nesse caso, não há efeito no valor da variável passada nos argumentos da função. O que acontece aqui é que uma cópia separada da variável passada é criada na memória e todas as operações são realizadas nessa cópia específica. O exemplo de código a seguir nos mostra como podemos passar uma variável de tipo de valor por valor em C#.

using System;

namespace pass_object_by_reference {
  class Program {
    static void method1(string value) {
      value = "something";
      Console.WriteLine("New value = {0}", value);
    }

    static void Main(string[] args) {
      string valueType = "Nothing";
      method1(valueType);
      Console.WriteLine("Original Value = {0}", valueType);
    }
  }
}

Resultado:

New value = something Original Value = Nothing

No código acima, passamos a variável string valueType por valor para a função method1() que atribui um novo valor à variável passada. Duas cópias diferentes de variáveis ​​com o mesmo valor são criadas na memória quando passamos a variável valueType por valor para a função method1(). E então, a segunda cópia da variável é modificada para o valor something. Esta segunda cópia só está acessível dentro da função method1(). Qualquer alteração neste segundo valor não altera a variável original valueType.

Passe variáveis ​​por referência a uma função em C#

Também podemos passar uma variável de tipo de valor por referência com a palavra-chave ref em C#. A palavra-chave ref especifica que um valor é passado por referência para uma função. Com essa abordagem, haverá apenas uma cópia da variável na memória e um ponteiro separado será passado para a função que aponta para o valor da variável. O exemplo de código a seguir nos mostra como passar uma variável de tipo de valor por referência com a palavra-chave ref em C#.

using System;

namespace pass_object_by_reference {
  class Program {
    static void method1(ref string value) {
      value = "something";
      Console.WriteLine("New value = {0}", value);
    }

    static void Main(string[] args) {
      string valueType = "Nothing";
      method1(ref valueType);
      Console.WriteLine("Original Value = {0}", valueType);
    }
  }
}

Resultado:

New value = something Original Value = something

No código acima, passamos a variável de tipo de valor valueType por referência à função method1() com a palavra-chave ref em C#. A função method1() leva uma referência à variável valueType como um argumento e modifica o valor da variável valueType para something. Desta vez, o valor original é modificado.

Passe objetos por referência a uma função em C#

Por padrão, todas as variáveis ​​de tipo de referência como instâncias de classe, instâncias de estrutura, etc. são passadas por referência para as funções em C#. O que acontece aqui é que o objeto original nunca é passado como parâmetro para uma função. Uma nova referência ao objeto é passada por valor como um argumento para a função. Então, acabamos tendo duas cópias de ponteiros que apontam para o mesmo local da memória. Se modificarmos o valor desse ponteiro, o valor do objeto original também será modificado. O exemplo de código a seguir nos mostra como passar um objeto por referência a uma função em C#.

using System;

namespace pass_object_by_reference {
  public class Sample {
    public string s { get; set; }
  }
  class Program {
    static void dosomething(Sample obj) {
      obj.s = "something";
    }
    static void Main(string[] args) {
      Sample sam = new Sample();
      sam.s = "Nothing";
      dosomething(sam);
      Console.WriteLine(sam.s);
    }
  }
}

Resultado:

something

No código acima, passamos o objeto sam por referência à função dosomething() que modifica a propriedade s dentro do objeto sam. Ele muda o valor do objeto sam original e atribui something à propriedade sam.s. Embora essa seja a maneira padrão de passar objetos por referência, há uma exceção a essa abordagem. Se inicializarmos o objeto passado com a palavra-chave new e o construtor de classe, uma cópia separada do objeto é criada dentro da memória. Quaisquer alterações no valor desse objeto não alteram o objeto original passado como parâmetro. O exemplo de código a seguir demonstra um cenário em que este objeto é passado por valor para uma função em C#.

using System;

namespace pass_object_by_reference {
  public class Sample {
    public string s { get; set; }
  }
  class Program {
    static void dosomething(Sample obj) {
      Console.WriteLine("Initial passed value = {0}", obj.s);
      obj = new Sample();
      obj.s = "something";
      Console.WriteLine("New value = {0}", obj.s);
    }
    static void Main(string[] args) {
      Sample sam = new Sample();
      sam.s = "Nothing";
      dosomething(sam);
      Console.WriteLine("Original Value = {0}", sam.s);
    }
  }
}

Resultado:

Initial passed value = Nothing New value = something Original Value = Nothing

Passamos o objeto sam por valor para a função dosomething() em C# no código acima. A função dosomething() pega o argumento, imprime seu valor inicial, modifica o valor e imprime o valor modificado. Este novo valor é atribuído a um novo local de memória e não pode ser acessado pelo objeto original sam.

Muhammad Maisam Abbas avatar Muhammad Maisam Abbas avatar

Maisam is a highly skilled and motivated Data Scientist. He has over 4 years of experience with Python programming language. He loves solving complex problems and sharing his results on the internet.

LinkedIn

Artigo relacionado - Csharp Class