.NET имеет тенденцию держаться подальше от массивов для всех, кроме самых простых и традиционных случаев использования. Для всего остального существуют различные реализации перечислимых / коллекций.
Если вы хотите пометить набор данных как неизменяемый, вы выходите за рамки возможностей, предоставляемых традиционным массивом. .NET предоставляет эквивалентные возможности, но технически не в форме массива. Чтобы получить неизменяемую коллекцию из массива, используйте ">Array.AsReadOnly<T>
:
var mutable = new[]
{
'a', 'A',
'b', 'B',
'c', 'C',
};
var immutable = Array.AsReadOnly(mutable);
immutable
будет ">ReadOnlyCollection<char>
экземпляром. В более общем случае вы можете создать ">ReadOnlyCollection<T>
из любой общей реализации ">IList<T>
.
var immutable = new ReadOnlyCollection<char>(new List<char>(mutable));
Обратите внимание, что это должна быть общая реализация; обычный старый IList
не будет работать, а это означает, что вы не можете использовать этот метод в традиционном массиве, который реализует только IList
. Это раскрывает возможность использования ">Array.AsReadOnly<T>
в качестве быстрого средства получения доступа к универсальным реализациям, которые обычно недоступны через традиционный массив.
">ReadOnlyCollection<T>
предоставит вам доступ ко всем функциям, которые можно ожидать от неизменяемого массива:
// 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' }