Tengo la situación extremadamente improbable y original de querer devolver una matriz de solo lectura de mi propiedad. Hasta ahora solo conozco una forma de hacerlo: a través del System.Collections.ObjectModel.ReadOnlyCollection<T>
. Pero eso de alguna manera me parece incómodo, sin mencionar que esta clase pierde la capacidad de acceder a los elementos de la matriz por su índice (agregado: whoops, me olvidé del indexador). ¿No hay mejor manera? ¿Algo que podría hacer que el conjunto sea inmutable?¿Cuál es la mejor manera de crear una matriz de solo lectura en C#?
Respuesta
Uso ReadOnlyCollection<T>
. Es de solo lectura y, al contrario de lo que crees, tiene un indexador.
Las matrices no son inmutables y no hay forma de hacerlo sin usar una envoltura como ReadOnlyCollection<T>
.
Tenga en cuenta que la creación de un contenedor ReadOnlyCollection<T>
es una operación O (1) y no implica ningún costo de rendimiento.
actualización
Otras respuestas han sugerido sólo fundición colecciones a la nueva IReadOnlyList<T>
, que se extiende IReadOnlyCollection<T>
añadir un indexador. Desafortunadamente, esto en realidad no le da control sobre la mutabilidad de la colección, ya que podría ser devuelta al tipo de colección original y mutada.
En su lugar, usted debe utilizar el ReadOnlyCollection<T>
(el List<T>
método AsReadOnly()
o Array
s método estático AsReadOnly()
ayuda para envolver las listas y matrices en consecuencia) para crear un acceso inmutable a la colección y luego exponer que, ya sea directamente o como cualquier una de las interfaces que admite, incluyendo IReadOnlyList<T>
.
'ReadOnlyCollection' no es utilizable como una colección inmutable. Es un poco _less_ que un Array, pero con el código _more_ a su alrededor. Su única 'característica' no es permitir que sus _usuarios_ modifiquen la colección, pero ni siquiera garantiza eso a los usuarios ... En pocas palabras: ¡inútil! – gatopeich
@gatopeich: inútil es una afirmación infundada. Proporcione sus fuentes en cuanto a su falta de uso. Sin embargo, buen diantre. –
Ojalá hubiera una interfaz IReadOnlyList que implementaría esta clase. – Kugel
IEnumerable viene a la mente.
¿Quiere lanzar mi matriz a un IEnumerable y devolver eso? Eso sería incluso peor que ReadOnlyCollection. Antes que nada, cualquiera podría lanzarlo fácilmente al arreglo y modificarlo. En segundo lugar, proporciona un subconjunto aún más pequeño de la funcionalidad que ofrecen las matrices. –
Puede hacer que esto funcione bien con un iterador (declaración de rendimiento). –
Es posible que desee implementar la interfaz IEnumerable y sobrecargar el este [int] operador para denegar el acceso a su setter
decir que? ¿De qué manera es mejor que ReadOnlyCollection mencionado anteriormente? –
traducción: "es posible que desee implementar una interfaz, pero no ponerlo en práctica" -1 –
Si realmente desea que se devuelva una matriz, pero tiene miedo de que el consumidor de la matriz se meta con los datos internos, simplemente devuelva una copia de la matriz. Personalmente sigo pensando ReadOnlyCollection<T>
es el camino a seguir, pero si realmente desea una matriz .....
Parece una buena idea, hasta que te des cuenta de qué clase.MyArray [i] hará en un bucle. Hazlo 1000 veces y tienes 1000 copias de la matriz. – RichardOD
@RichardOD Cierto, pero tú no haces eso. Si accede por índice en la clase principal, simplemente devuelve los elementos. Si devuelve la matriz, proporcione al usuario una función que devuelva una copia de la matriz e itere sobre ella. –
De .NET Framework 2.0 y allí es Array.AsReadOnly que crea automáticamente un envoltorio ReadOnlyCollection para usted.
.NET Framework 4.5 introdujo IReadOnlyList<T>
que se extiende desde IReadOnlyCollection<T>
sumando T this[int index] { /*..*/ get; }
.
Puede transmitir de T[]
a IReadOnlyList<T>
. Una ventaja de esto es que (IReadOnlyList<T>)array
comprensiblemente es igual a array
; no hay boxeo involucrado.
Por supuesto, como una envoltura no se está utilizando, (T[])GetReadOnlyList()
sería mutable.
El problema con solo enviar contenido a la interfaz es que se puede enviar de nuevo, como usted señala. Esto significa que no tiene control sobre la mutabilidad de los datos. Debería seguir utilizando 'ReadOnlyCollection
Argumentaría que esto se reduce a contratos: si le devuelvo un objeto, entonces le he dado permiso para usar los métodos expuestos por ese objeto. Si decide, por ejemplo, usar la reflexión para mirar y manipular las entrañas de ese objeto, entonces se perderán todas las garantías. Del mismo modo, si le devuelvo un IEnumerable
Tenga en cuenta que iterar a través de esto es casi diez veces más lento que iterar a través de una matriz. –
- 1. ¿Cuál es la mejor manera de crear una matriz dispersa en C++?
- 2. ¿Cuál es la mejor manera de crear una matriz secundaria a partir de una matriz existente en C++?
- 3. ¿Cuál es la mejor manera de crear una matriz de crecimiento dinámico en Scala?
- 4. ¿cuál es la mejor manera de verificar una matriz vacía?
- 5. La mejor manera de crear una matriz singleton
- 6. Solo lectura de matriz bidimensional en C#
- 7. ¿Cuál es la mejor manera de escribir una matriz corta [] en un archivo en C#?
- 8. ¿Cuál es la mejor manera de crear consultas complejas RESTful?
- 9. ¿Cuál es la mejor manera de escribir comentarios en C?
- 10. La mejor manera de ordenar una matriz
- 11. C# ¿Cuál es la mejor manera de crear una enumeración utilizada por varias clases?
- 12. ¿Cuál es la mejor manera de serializar una matriz basada en una interfaz en WCF?
- 13. ¿Cuál es la mejor manera de almacenar cadenas UTF-8 en memoria en C/C++?
- 14. ¿Cuál es la mejor manera de dibujar en la consola?
- 15. ¿Cuál es la mejor manera de hacer una tabla de búsqueda en C?
- 16. ¿Cuál es la mejor manera de crear un asistente en C# 2.0?
- 17. ¿Cuál es la mejor manera de consultar una matriz en javascript para obtener solo los elementos de ella que quiero?
- 18. ¿Cuál es la mejor manera de deducir una mesa?
- 19. ¿Cuál es la mejor manera de contar la longitud absoluta de la matriz en JavaScript?
- 20. Cuál es la mejor manera de autorizar una llave USB
- 21. ¿Cuál es la mejor manera de hacer bucles en JavaScript
- 22. ¿Cuál es la mejor manera de perfilar una aplicación Sinatra?
- 23. ¿Cuál es la mejor manera de eliminar duplicados en una matriz en Java?
- 24. ¿Cuál es la mejor manera de declarar una variable global?
- 25. Cuál es el mejor diseño de clase C# para tratar con lectura + escritura versus solo
- 26. ¿Cuál es la mejor manera de crear una página estática en Rails?
- 27. ¿Cuál es la mejor manera de unir solo letras en una expresión regular?
- 28. ¿Cuál es la mejor manera de construir una NSCompoundPredicate compleja?
- 29. ¿Cuál es la mejor manera de rellenar una plantilla de Word 2007 en C#?
- 30. ¿Cuál es la mejor manera de incrementar una enumeración?
ReadOnlyCollection tiene un indexador, admite la indexación. No puedes hacer una matriz inmutable. –
En realidad, ReadOnlyCollection ** does ** tiene una propiedad del indexador ... –
BFree
@BFree - pero (importante) que no le permite reasignar éxito artículos a través de la @nobugz indexador –