Inquiridor
Objetos passado por parâmetro é referencia ou valor

Pergunta
-
Li alguns materiais, e não consegui entender um conceito
no código abaixo, passo um objeto por parametro, e quando, dentro do metodo, altero uma propriedade do objeto, ele modifica, mas na verdade nao estou passando uma referencia, e sim, um valor, então como é possivel ele alterar o valor do objeto?
Se o objeto é uma cópia (um valor) então todas as variaveis dela também deveria ser uma cópia, isso no meu raciocinio, só que não está funcionando dessa forma
class Program { public static void alter(Pessoa p) { p.idade = 99; // porque aqui modifica o valor p = new Pessoa("Katte", 100); // porque aqui não? //só tem efeito dentro do metodo alter, nao modificando o valor p.Display(); // PORQUE MEU DEUS!!?? } static void Main(string[] args) { Pessoa p1 = new Pessoa("Jhon", 20); p1.Display(); alter(p1); p1.Display(); Console.ReadKey(); } } public class Pessoa { public string Nome; public int idade; public Pessoa(string n, int i) { Nome = n; idade = i; } public void Display() { Console.WriteLine("Nome: {0}, Idade: {1}", Nome , idade); } }
- Editado Yuri Schmitz sexta-feira, 15 de março de 2013 16:56
Todas as Respostas
-
-
Para você passar o parâmetro como referência, tem que usar ref keywork. Exemplo:
class Program { public static void alter(ref Pessoa p) { p.idade = 99; // porque aqui modifica o valor p = new Pessoa("Katte", 100); // porque aqui não? //só tem efeito dentro do metodo alter, nao modificando o valor p.Display(); // PORQUE MEU DEUS!!?? } static void Main(string[] args) { Pessoa p1 = new Pessoa("Jhon", 20); p1.Display(); alter(ref p1); p1.Display(); Console.ReadKey(); } } public class Pessoa { public string Nome; public int idade; public Pessoa(string n, int i) { Nome = n; idade = i; } public void Display() { Console.WriteLine("Nome: {0}, Idade: {1}", Nome, idade); } }
In C#, parameters can be passed either by value or by reference. Passing parameters by reference allows function members (methods, properties, indexers, operators, and constructors) to change the value of the parameters and have that change persist. To pass a parameter by reference, use the ref or out keyword. For simplicity, only the refkeyword is used in the examples of this topic. For information on the difference between ref and out, see ref, out, and Passing Arrays Using ref and out.
http://msdn.microsoft.com/en-us/library/0f66670z(v=vs.71).aspx
------------------ // -----------------------
http://yoda.arachsys.com/csharp/parameters.html
Here we declare a variable
first
, create a newStringBuilder
object, and assign tofirst
a reference to the object. We then assign tosecond
the value offirst
. This means that they both refer to the same object. If we modify the contents of the object via another call tofirst.Append
, that change is visible viasecond
:StringBuilder first = new StringBuilder(); first.Append("hello"); StringBuilder second = first; first.Append(" world"); Console.WriteLine(second); // Prints hello world
They are still, however, independent variables themselves. Changing the value of
first
to refer to a completely different object (or indeed changing the value to a null reference) doesn't affectsecond
at all, or the object it refers to:StringBuilder first = new StringBuilder(); first.Append("hello"); StringBuilder second = first; first.Append(" world"); first = new StringBuilder("goodbye"); Console.WriteLine(first); // Prints goodbye Console.WriteLine(second); // Still prints hello world
Tudo o que fiz foi colar alguns artigos da internet, que eu acho que seriam a melhor forma de entender (principalmente o segundo). Caso ainda haja dúvida só perguntar!
Ao infinito e além!
- Editado Fabio R. Luz sexta-feira, 15 de março de 2013 19:32
- Sugerido como Resposta Janderson Candido de Mattos sexta-feira, 22 de março de 2013 13:07