sirve que propiedades propiedad para metodos metodo mandar llamar funciones entre diferencia como campo autoimplementadas accesores c# properties readonly

c# - propiedades - para que sirve el get y set



Restringir el acceso a las llamadas a métodos en propiedades de solo lectura (5)

Desea _myList, que es un tipo de referencia para ser de solo lectura. Bueno, es de solo lectura y no hay derrota del concepto de solo lectura.

El CLR implementa una propiedad de solo lectura para los tipos de referencia de tal manera que la referencia (puntero al objeto si lo desea) es lo que se hace solo mientras el objeto al que apunta la referencia se puede modificar.

Para evitar esto, necesitaría crear los campos de miembro del objeto ellos mismos, de solo lectura, porque no puede hacer que el objeto entero sea de solo lectura al unir un indicador de solo lectura a la referencia del objeto.

Puede implementar su clase de colección genérica inmutable que se comportaría de la misma manera que el objeto List <> pero teniendo solo miembros readonly.

Tengo una clase que define una propiedad de solo lectura que expone efectivamente un campo privado, algo como esto:

public class Container { private List<int> _myList; public List<int> MyList { get { return _myList;} } public Container() : base () { _myList = new List<int>(); } // some method that need to access _myList public SomeMethod(int x) { _myList.Add(x); } }

ahora es imposible para el consumidor administrar mi propiedad directamente, así que codifique como aContainer.MyList = new List (); genera un error en tiempo de compilación. Sin embargo, el consumidor es absolutamente libre de llamar a todo tipo de métodos sobre la referencia que obtuvo, por lo que este es un código perfectamente válido

Container c = new Container(); Console.WriteLine(c.MyList.Count); c.MyList.Add(4); Console.WriteLine(c.MyList.Count);

que tipo de derrotas todo el concepto de solo lectura.

¿Hay alguna solución sensata que me permita tener una propiedad de referencia de solo lectura real?

PD. No puedo simplemente devolver una copia de la lista porque entonces el usuario pensará que hizo todos los cambios necesarios, pero desafortunadamente ... se habrán ido.


No devuelva una referencia directa a su lista. En su lugar, devuelva un ReadOnlyCollection alrededor de él, o si el tipo de declaración List <> está escrito en piedra, devuelva una copia de su lista. Pueden hacer lo que quieran con la copia sin afectar el original.


Podrías devolver una colección de solo lectura como esta:

public ReadOnlyCollection<int> MyList { get { return _myList.AsReadOnly(); } }

o devolver una nueva lista para que la persona que llama pueda cambiar la lista sin cambiar la lista original.

public List<int> MyList { get { return new List<int>(_myList)} }


Eche un vistazo al método estático Array.AsReadOnly () , que puede usar para devolver un contenedor alrededor de una matriz que impide que se modifique.


La referencia es "solo lectura" , el objeto real. Es decir, no puede reemplazar la referencia con otro objeto. Entonces, si tienes una clase que lo rompe así:

public class Container { private readonly List<int> _myList; public List<int> MyList { get { return _myList;} } public Container() : base () { _myList = new List<int>(); } public void BreakReadOnly() { _myList = new List<int>(); } }

... entonces ni siquiera compilará. Es porque un campo de solo lectura no se puede reasignar con ningún otro objeto. En este caso, BreakReadOnly intentará asignar una nueva lista.

Si realmente quieres una colección de solo lectura, puedes hacerlo así:

public ReadOnlyCollection<int> MyList { get { return _myList.AsReadOnly(); } }

Espero que esto ayude.

Actualizado : se eliminó el uso de IEnumerable.