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