2009-07-06 18 views
6

¿Es bueno utilizar dicho enfoque para mantener la lista de cadenas de solo lectura, por ejemplo, una lista de campos en ADO.NET?Lista de cadenas de solo lectura

var list = new System.Collections.ObjectModel.ReadOnlyCollection<string>(
      new List<string>(4) { "type", "currency", "date", "amount" }); 

¿O esta es una solución superflua?

Respuesta

8

Depende de su posición. ReadOnlyCollection funciona muy bien cuando tiene una lista interna modificable que debe darse a algún otro código que no está permitido cambiar la lista. Para código simple, usar ReadOnlyCollection es probablemente excesivo. Si el código es grande y existe el riesgo de que algún otro programador (o usted, en el futuro) intente modificar accidentalmente la lista, entonces podría valer la pena.

En resumen: no use ReadOnlyCollection idiomáticamente, úselo cuando tenga sentido.

5

Si es posible, prefiera la comprobación del tipo estático. IEnumerable<string> es de solo lectura.

IEnumerable<string> list = new List<string> { "type", "currency", "date", "amount" }; 

código subsiguiente no puede modificar la lista, y los errores será atrapado en tiempo de compilación - a menos que utilice la reflexión, pero luego la reflexión podría ser utilizado para eludir los controles de tiempo de ejecución así.

+0

No, no use esto ya que el código subsiguiente simplemente puede devolverlo a 'List '; la reflexión no es requerida. –

+1

@KevinBrock Incluso si se requiriera reflexión, sería un esfuerzo cero para desplazarse, consulte: http://stackoverflow.com/a/1232332/27423 - tratando de "bloquear" el desenvolvimiento de su contenedor "readonly" es peor que inútil. Agrega complejidad (y tal vez costo de tiempo de ejecución) sin agregar ningún valor real. Documente el uso correcto de su API a través del sistema de tipo estático; cualquier otra cosa no tiene sentido. –

4

Volviendo a .NET 2.0, la clase List tenía un método AsReadOnly(). Cuando llegaron los genéricos, el List<T> también lo consiguió. Aquí está el MSDN reference page.