Sé cómo usar las propiedades y entiendo que invocan implícitamente los accesos subyacentes get
y set
, dependiendo de si estamos escribiendo o leyendo desde una propiedad.¿Esto no acaba con el propósito de tener propiedades de solo lectura?
static void Main(string[] args)
{
A a = new A();
(a.b).i = 100;
}
class A
{
private B _b = new B();
public B b
{
get { return _b; }
}
}
class B
{
public int i;
}
¿Qué código (a.b).i = 100;
hace esencialmente es que get
de acceso de primera propiedad devuelve una referencia a un objeto _b
, y una vez que tengamos esta referencia, que son capaces de acceder _b’s
miembros y cambiar sus valores.
Por lo tanto, en nuestro ejemplo, tener propiedad de solo lectura impide que el código externo cambie el valor de una variable de referencia _b
, pero no impide que los códigos externos accedan a los miembros _b’s
.
Parece que la propiedad solo puede detectar si estamos tratando de leer o escribir en una variable (en nuestra variable de caso _b
) ubicada en la pila, mientras que no puede detectar si también estamos tratando de escribir a los miembros de un objeto al que apunta la variable en la pila (asumiendo que esta variable es de tipo de referencia).
a) ¿Pero eso no acaba con el propósito de tener propiedades de solo lectura? ¿No sería más efectivo si las propiedades tuvieran la capacidad de detectar también si estamos tratando de acceder a los miembros de un objeto devuelto por get accessor (suponiendo que el campo de respaldo es de un tipo de referencia)?
gracias
@Oded: Este no es el tipo de 'readonly' sobre el que OP está preguntando. – Brian
¿Devolver una copia? Si sabe que las clases son tipos de referencia, este comportamiento se vuelve obvio. No hay nada en el código anterior que diga que B debe ser inmutable, excepto que simplemente no le dio una propiedad de conjunto. – Puppy