Aquí hay dos conceptos por separado. La primera es que DateTime
es un tipo de valor (a.k.a. una estructura) mientras que Person
es [presumiblemente] un tipo de referencia (una clase). Debido a esto, cuando lo hace:
DateTime date1 = DateTime.Now;
DateTime date2 = date1;
date2
dará lugar a copiar el valor, por lo que las dos variables no va a hacer referencia al mismo objeto.
Con las clases, cuando lo hace:
Person p1 = new Person();
Person p2 = p1;
p1
no contiene realmente un Person
, que sólo contiene una referencia a una persona . Esa referencia luego se copia (por valor) a p2
. El efecto de copiar esa referencia es que ambas variables ahora están "apuntando a" o "haciendo referencia" al mismo objeto.
A continuación está la cuestión de la mutabilidad.Person
, en este caso, es un tipo mutable. Eso significa que puede ser cambiado. Por otro lado, un tipo inmutable no se puede cambiar una vez construido.
La línea:
p2.Age = 2;
es en realidad cambiar el objeto que p2
referencias, y desde p2
y p1
tanto referencia al mismo objeto, p1.Age
sería 2
después de esa línea de código.
Ahora, con fines de demostración, vamos a hacer un inmutable clase Person
:
public class Person
{
private int _age;
public Person(int someAge)
{
_age = someAge;
}
public int Age
{
get { return _age; }
}
public Person Grow()
{
return new Person(_age + 1);
}
}
Si hacemos algo como esto:
Person p1 = new Person(1);
Person p2 = p1;
p2 = p2.Grow();
la segunda línea está haciendo precisamente lo que era antes, asegurando que ambos apuntan al mismo objeto, pero la tercera línea es diferente. En lugar de cambiar (o mutar) a esa persona para que sea un año más antiguo, nuestro método Grow
devuelve un nuevo objeto Person
que representa a alguien un año mayor. Después de hacer esto, p2
y p1
ya no estarán haciendo referencia al mismo objeto; Acabo de cambiar el objeto p2
referencias a uno nuevo que acaba de crear el método Grow
.
Este segundo ejemplo es bastante similar a lo que está sucediendo con DateTime
. No puede mutar un objeto DateTime
; es inmutable Llamar a sus métodos (en este caso, los operadores más y menos) devuelve un objeto completamente nuevo. Por convención, los tipos de valor no deben ser mutables sin una razón convincente, ya que a menudo puede ser complicado lidiar con ellos. Los tipos de referencia pueden ser inmutables o mutables; ninguno tiene problemas significativos (en el caso general).
DateTime es un tipo de valor, no un tipo de referencia –
Comprobar esta respuesta http://stackoverflow.com/a/4265417/1511796 –