Как привычка, Всегда ОБЪЕДИНЕНИЕ использования ВЕСЬ . Используйте только ОБЪЕДИНЕНИЕ в особых случаях, когда необходимо устранить дубликаты, которые могут быть чрезвычайно грязными, и можно считать все о в других комментариях здесь.
В часто задаваемых вопросах по C # есть страница об этой конкретной вещи.
Они предлагают использовать статический массив только для чтения:
static readonly int[,] constIntArray = new int[,] { { 1, 2, 3 }, { 4, 5, 6 }};
Однако имейте в виду, что это всего лишь своего рода константа - вы все равно можете переназначать отдельные элементы в массиве. Кроме того, это должно быть указано на уровне класса, поскольку оно статическое, но оно будет работать достаточно хорошо.
Что ж, я использовал следующий подход: немного неприятно читать, но легко редактировать.
public struct Something
{
public readonly int Number;
public readonly string Name;
public Something(int num, string name) { this.Number = num; this.Name = name; }
}
public readonly Something[] GlobalCollection = new Something[]
{
new Something(1, "One"),
new Something(2, "Two"),
};
Вы можете использовать Hashtable только для чтения. Единственным недостатком является то, что только чтение не мешает вам изменять значение определенного элемента в Hashtable. Так что это не совсем константа.
readonly Hashtable table = new Hashtable(){{1,"One"},{2,"Two"}};
Или массив
public readonly string[,] arry = new string[,]{{"1","2"},{"2","4"}};
Да, вам нужно будет объявить переменную в соответствующей области, чтобы она не инициализировалась более одного раза.
Как они говорят, просто добавьте еще один уровень косвенности. В C # нет необходимости предоставлять специализированную структуру данных в качестве языкового примитива, хотя иногда хочется, чтобы был способ сделать любой класс неизменяемым, но это уже другое обсуждение.
Теперь вы не упомянули, если вы нужно хранить там разные вещи. Фактически, вы не упомянули ничего, кроме многомерного и никакой возможности изменять значения или массивы. Я даже не знаю, подходит ли шаблон доступа (единственный индексатор int, int, int).
Но в целом для трехмерного массива с зубчатыми краями работает следующее (но это не очень красиво).
Одно предостережение: тип, из которого вы его создаете, также должен быть неизменным, но это ваша проблема. Вы можете просто создать свою собственную оболочку только для чтения.
public static readonly ReadOnlyThreeDimensions<int> MyGlobalThree
= new ReadOnlyThreeDimensions<int>(IntInitializer);
public class ReadOnlyThreeDimensions<T>
{
private T[][][] _arrayOfT;
public ReadOnlyThreeDimensions(Func<T[][][]> initializer)
{
_arrayOfT = initializer();
}
public ReadOnlyThreeDimensions(T[][][] arrayOfT)
{
_arrayOfT = arrayOfT;
}
public T this [int x, int y, int z]
{
get
{
return _arrayOfT[x][y][z];
}
}
}
И тогда вам просто нужно предоставить какой-нибудь метод инициализатора или назначить его в статическом конструкторе.
public static int[][][] IntInitializer()
{
return xyz // something that constructs a [][][]
}