c# - tipos - Pasar objetos de tipo de referencia y cambiar los valores
tipos por valor y por referencia c# (2)
Además de la respuesta de RedPolygon ... Siento que esto podría aclarar las cosas.
Como se explicó, está cambiando el valor de la referencia ... no el objeto al que apunta la referencia.
Cambia tu código a esto:
public interface IPerson {
string Name { get; set; }
}
public void CreateTeacher(IPerson teacher) {
teacher.Name = "Teacher name";
}
IPerson teacher = new Teacher();
CreateTeacher(teacher);
..que funcionará. ¿Por qué? Un par de razones.
- Ya no es
null
, lo "renovamos". - No está "actualizándolo" en el método
CreateTeacher
, señalando la referencia copiada en un objeto completamente nuevo. Esto significa que está cambiando el objeto al que apuntan sus dos referencias.
Es confuso ... sí, pero lo entiendes cuando juegas con ejemplos como este.
EDITAR:
Tuve que encender la pintura y poner mis increíbles habilidades de MSPaint en exhibición:
Este es tu primer flujo de fragmentos:
Este es mi fragmento (y el segundo):
Estoy intentando pasar el tipo de objeto de referencia a un método y cambiarlo desde allí. Cuando lo cambio no tengo ese cambio en la variable que se pasa al método.
Aquí está el ejemplo:
public interface IPerson
{
string Name { get; }
}
public class Teacher : IPerson
{
public string Name { get; set; }
public string LastName { get; set; }
}
//......
public void CreateTeacher(IPerson teacher)
{
teacher = new Teacher() { Name = "Teacher name", LastName = "Teacher''s last name"};
}
//.....
//I am trying this, but after I call CreateTeacher() variable teacher is null
IPerson teacher=null;
CreateTeacher(teacher);
string n = teacher.Name;
Después de ejecutar la maestra de la variable CreateTeacher()
, ¿sigue siendo nulo? ¿Alguien puede explicar por qué? Sé que podría devolver IPerson
en mi método CreateTeacher()
o usarlo, pero no puedo usarlos.
La interfaz IPerson
está en una dll diferente y Teacher
clase Teacher
está en una dll diferente. El método CreateTeacher
es el mismo dll donde está la clase.
ACTUALIZAR:
Aquí hay algo más que probé:
IPerson teacher=new Teacher();
CreateTeacher(teacher);
string n = teacher.Name;//I have the changes here now
//......
public void CreateTeacher(IPerson teacher)
{
((Teacher)teacher).Name = "My Name";
}
¿Cuál es la diferencia entre el primer ejemplo y el segundo? ¿Es porque el valor pasado fue null
?
¡Gracias por la ayuda!
C # pasa por valores, no referencias. En su caso, está pasando por valor una referencia que está tratando de cambiar. Desea indicar explícitamente que desea pasar por referencia su referencia utilizando la palabra clave ref
:
public void CreateTeacher(ref IPerson teacher)
{
teacher = new Teacher() { Name = "Teacher name", LastName = "Teacher''s last name"};
}
O mejor aún:
public Teacher CreateTeacher()
{
return new Teacher() { Name = "Teacher name", LastName = "Teacher''s last name"};
}