2010-01-28 6 views
6

Si tengo una clase que contiene, por ejemplo, una lista de <cadena> y quiero otras clases para ser capaz de ver la lista, pero no puse, puedo declareevitar que otras clases de alterar una lista en una clase

public class SomeClass() 
{ 
    public List<string> SomeList { get; } 
} 

Esto permitirá que otra clase acceda a SomeList y no la configure.

Sin embargo, aunque la clase de llamada no puede establecer la lista, puede agregar o quitar elementos. ¿Cómo lo evito? Supongo que podría usar un campo y devolver una copia de la lista en lugar de usar una propiedad, pero eso no parece correcto.

(esto debería ser muy simple pero hay que falta algo ....)

+2

duplicado: http://stackoverflow.com/questions/619396/read-only-property-accessor-in-c –

+0

Estaba seguro que era una víctima, simplemente no lo pude encontrar ... –

+0

Yo _estaba cerrando esto como una tontería, pero la respuesta dada es suficientemente diferente de las respuestas en la pregunta "engañosa" que creo que debería permanecer. Hasta la comunidad, ahora ... –

Respuesta

11

No podrá utilizar una propiedad automática.

public class SomeClass() 
{ 
    private List<string> someList; 
    public IList<string> SomeList { 
     get { return someList.AsReadOnly(); } 
    } 
} 
+0

Según MSDN, esta operación es O (1), por lo que no debe preocuparse por el rendimiento alcanzado. – Bryan

+0

El único problema es que la modificación de la lista interna hará que las enumeraciones fallen. –

+0

Sí, noté que IList necesitaba ser utilizado (pero no tenía AsReadOnly() como método). Esta parece ser la "mejor" apuesta hasta el momento; aún así se siente mal, sin embargo. –

4

Usted querrá volver la lista como un . Puede hacerlo con el siguiente código:

using System.Collections.ObjectModel; 

public ReadOnlyCollection<string> GetList() { 
    return SomeList.AsReadOnly(); 
} 
2

Devuelve IEnumerable<string>, que es inmutable. El comprador debe tener este aspecto:

public IEnumerable<string> SomeList 
{ 
    get 
    { 
     foreach(string s in someList) yield return s; // excuse my inline style here, zealots 
     yield break; 
    } 
} 
+0

Aunque un poco más complicado que la ruta AsReadOnly, me gusta esta implementación un poco mejor –

+0

Esto impide el acceso aleatorio en la lista. –

+1

Tiene razón, Anon, pero siempre me imagino que requerir acceso aleatorio es tener algún conocimiento sobre la colección. Cualquier persona que llame a este método solo podría hacer suposiciones sobre la colección que obtiene, que yo prefiero no permitir que haga. – Jay

0
public class SomeClass() 
{ 
    private List<string> _someList = new List<string>(); 

    public IList<string> SomeList 
    { 
     get { return _someList.AsReadOnly(); } 
    } 
} 
Cuestiones relacionadas