Esto ya se ha dicho, pero no veo ninguna de las respuestas como superclear.
La forma más fácil es simplemente devolver un ReadOnlyCollection
private List<object> objs;
public ReadOnlyCollection<object> Objs {
get {
return objs.AsReadOnly();
}
}
La desventaja de esto es que si usted quiere cambiar su puesta en práctica más adelante, a continuación, algunas personas que llaman pueden ya ser dependiente en el hecho, de que la la colección proporciona acceso aleatorio. Así que una definición más seguro sería simplemente exponer a un IEnumerable
public IEnumerable<object> Objs {
get {
return objs.AsReadOnly();
}
}
Tenga en cuenta que usted no tiene que llamar AsReadOnly() para compilar el código. Pero si no lo hace, la persona que llama simplemente arroja el valor de retorno a una lista y modifica su lista.
// Bad caller code
var objs = YourClass.Objs;
var list = objs as List<object>;
list.Add(new object); // They have just modified your list.
Lo mismo es posible problema también existe con esta solución
public IEnumerable<object> Objs {
get {
return objs.AsEnumerable();
}
}
Así que sin duda recomiendo que llame AsReadOnly() en su lista, y devuelve ese valor.
Tenga en cuenta que nunca optimizaríamos una llamada * explicit * para seleccionar si eso aparecía en su código. Optimizaremos la llamada implícita a Seleccionar al transformar una expresión de consulta en llamadas a métodos. Si dices "de x en y donde b selecciona x", no hay una llamada de selección, solo un lugar. Pero si dices "de x en y selecciona x", no generamos "y", generamos una llamada de selección para asegurar la inmutabilidad del resultado. –