.NET tiende a alejarse de las matrices para todos los casos menos el más simple y tradicional. Para todo lo demás, hay varias implementaciones enumerables/de colección.
Cuando desea marcar un conjunto de datos como inmutables, está yendo más allá de la capacidad proporcionada por una matriz tradicional. .NET proporciona una capacidad equivalente, pero no técnicamente en forma de matriz. Para tener una colección inmutable de una matriz, utilice Array.AsReadOnly<T>
:
var mutable = new[]
{
'a', 'A',
'b', 'B',
'c', 'C',
};
var immutable = Array.AsReadOnly(mutable);
immutable
habrá una instancia ReadOnlyCollection<char>
. Como un caso de uso más general, puede crear un ReadOnlyCollection<T>
desde cualquier implementación genérica de IList<T>
.
var immutable = new ReadOnlyCollection<char>(new List<char>(mutable));
Tenga en cuenta que tiene que ser una implementación genérica; plain old IList
no funcionará, lo que significa que no puede usar este método en una matriz tradicional, que solo implementa IList
. Esto saca a la luz la posibilidad de usar Array.AsReadOnly<T>
como un medio rápido para obtener acceso a implementaciones genéricas que normalmente son inaccesibles a través de una matriz tradicional.
ReadOnlyCollection<T>
le dará acceso a todas las características que se esperan de una matriz inmutable:
// Note that .NET favors Count over Length; all but traditional arrays use Count:
for (var i = 0; i < immutable.Count; i++)
{
// this[] { get } is present, as ReadOnlyCollection<T> implements IList<T>:
var element = immutable[i]; // Works
// this[] { set } has to be present, as it is required by IList<T>, but it
// will throw a NotSupportedException:
immutable[i] = element; // Exception!
}
// ReadOnlyCollection<T> implements IEnumerable<T>, of course:
foreach (var character in immutable)
{
}
// LINQ works fine; idem
var lowercase =
from c in immutable
where c >= 'a' && c <= 'z'
select c;
// You can always evaluate IEnumerable<T> implementations to arrays with LINQ:
var mutableCopy = immutable.ToArray();
// mutableCopy is: new[] { 'a', 'A', 'b', 'B', 'c', 'C' }
var lowercaseArray = lowercase.ToArray();
// lowercaseArray is: new[] { 'a', 'b', 'c' }
Esa propiedad no se encuentra un nombre, ¿verdad? – Svish
La propiedad se llama "inmutable"; es en este sentido que las cadenas son inmutables (a menos que acceda al puntero del carácter en código inseguro, lo que realmente no debería hacer porque están internados). –
Tenga en cuenta que una matriz inmutable es tan inmutable como sus miembros. @PhilWhittington Quiso decir en el código, a la propiedad le falta un nombre. Es sintácticamente incorrecto. Sin embargo, no está destinado a ser un ejemplo de trabajo. – Zenexer