visual variable que propiedades propiedad programacion metodos hace descriptores automaticos acceso c# properties readonly

que - C#devuelve una variable como solo lectura desde get; conjunto;



que hace get y set en c# (7)

Juro que he visto un ejemplo de esto, pero he estado buscando en Google un poco y no puedo encontrarlo.

Tengo una clase que tiene una referencia a un objeto y necesita tener un GET; método para ello. Mi problema es que no quiero que nadie pueda jugar con él, es decir, quiero que obtengan una versión de solo lectura, (tenga en cuenta que necesito poder modificarlo desde mi clase).

Gracias


Devuelve una referencia a una interfaz reducida:

interface IFoo string Bar { get; } class ClassWithGet public IFoo GetFoo(...);


Esto no es posible Obtenga y configure los descriptores de acceso a los tipos de referencia y establezca la referencia al objeto. Puede evitar cambios en la referencia mediante el uso de un ajustador privado (o interno), pero no puede evitar cambios en el objeto en sí mismo si es expuesto por un getter.


Estoy de acuerdo con ReadOnlyCollection

Ver mi código simple:

private List<Device> _devices; public readonly System.Collections.ObjectModel.ReadOnlyCollection<Device> Devices { get { return (_devices.AsReadOnly()); }

}

ReadOnlyCollection no tiene método Add para que el usuario no pueda agregarle propiedades. SIN EMBARGO, no hay garantía de que el usuario pueda modificar objetos llamando a sus métodos ...


He enfrentado este problema de cierta manera. Tengo una clase CategoryViewModel, que tiene una categoría de propiedad que quiero de lectura privada:

public CategoryViewModel { private Category { get; } }

De hecho, quiero que se exporte como de solo lectura a otra clase. Sin embargo, no puedo hacer tal cosa. En mi caso (tal vez ayude a otros tipos), quiero agregarlo a un repositorio. La única forma que he encontrado es tener una función con el repositorio como param 1, y una acción como param 2:

public void ApplyAction(ICategoryRepository repo, Action<ICategoryRepository, Category> action) { action(repo, Category); }

De esa manera, de otro lado, puedo hacer tal cosa:

categoryViewModel.ApplyAction(_repository, (r, c) => r.MarkForInsertOrUpdate(c));

Esto puede ayudar a otros a exponer su propiedad solo para ciertos casos y puede administrarlos.


Si el objeto no es demasiado complicado / extenso, escriba un contenedor alrededor de él.

por ejemplo:

class A { public string strField = ''string''; public int intField = 10; } class AWrapper { private A _aObj; public AWrapper(A aobj) { _aObj = A; } public string strField { get { return _aObj.strField; } } public int intField { get { return _aObj.intField; } } }

Entonces, todo lo que haces es darle al código de tu cliente una instancia de la clase AWrapper para que solo puedan usar lo que les permitas ver.

esto puede ser un poco complicado y puede no escalarse bien si su clase base no está escrita en piedra, pero para la situación más simple, puede que sea el truco. Creo que esto se llama un patrón de fachada (pero no me cites en eso =))


Tu pregunta dice lo que estás buscando:

public PropertyName { get; private set; }

Pero luego, dadas las respuestas hasta ahora, no estoy seguro de interpretar tu pregunta correctamente. Además, ¿quién soy para interrogar a Jon Skeet? :)


No, no hay forma de hacer esto. Por ejemplo, si devuelve una List<string> (y no es inmutable), los llamantes podrán agregar entradas.

La forma normal de hacerlo es devolver una envoltura inmutable, por ejemplo, ReadOnlyCollection<T> .

Para otros tipos mutables, puede que necesite clonar el valor antes de devolverlo.

Tenga en cuenta que el solo hecho de devolver una vista de interfaz inmutable (por ejemplo, devolver IEnumerable<T> lugar de List<T> ) no impedirá que un emisor vuelva al tipo mutable y mute.

EDITAR: Tenga en cuenta que, aparte de cualquier otra cosa, este tipo de preocupación es una de las razones por las que los tipos inmutables hacen que sea más fácil razonar sobre el código :)