Passe objeto por referência em C#
-
Passe variáveis por valor para uma função em
C# -
Passe variáveis por referência a uma função em
C# -
Passe objetos por referência a uma função 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.
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