Questo è già stato detto, ma non vedo nessuna delle risposte come superclear.
Il modo più semplice è quello di restituire semplicemente un ReadOnlyCollection
private List<object> objs;
public ReadOnlyCollection<object> Objs {
get {
return objs.AsReadOnly();
}
}
Lo svantaggio di questo è che, se si desidera modificare l'implementazione in seguito, quindi alcuni chiamanti potrebbero già essere dipendente dal fatto, che la la raccolta fornisce l'accesso casuale. Quindi, una definizione più sicuro sarebbe quello di esporre solo un IEnumerable
public IEnumerable<object> Objs {
get {
return objs.AsReadOnly();
}
}
Si noti che non c'è bisogno di chiamare AsReadOnly() per compilare il codice. Ma se non lo fai, il chiamante mi limita a restituire il valore restituito a un elenco e a modificare l'elenco.
// Bad caller code
var objs = YourClass.Objs;
var list = objs as List<object>;
list.Add(new object); // They have just modified your list.
Lo stesso potenziale problema esiste anche con questa soluzione
public IEnumerable<object> Objs {
get {
return objs.AsEnumerable();
}
}
Quindi senz'altro consiglio che si chiama AsReadOnly() su di voi la lista, e restituire tale valore.
Nota che non ottimizzeremo mai una chiamata * esplicita * a Seleziona se è presente nel codice. Ottimizziamo la chiamata implicita a Seleziona quando trasformi un'espressione di query in chiamate di metodo. Se dici "da x in y dove b seleziona x" non c'è Seleziona, solo una Dove. Ma se dici "da x in y seleziona x" allora non generiamo solo "y", generiamo una chiamata select su di esso per garantire l'immutabilità del risultato. La risposta –