Обновить только для чтения массив int?
В классическом смысле объекты Readonly могут быть установлены только в конструкторе и не могут быть изменены позднее. Почему массивы readonly int ведут себя иначе?
PS: я в курсе Readonly
Коллекции, мне просто интересно узнать, почему это разрешено?
class Class1
{
public readonly int[] a;
public Class1()
{
a = new int[3];
a[0] = 1;
a[1] = 2;
a[2] = 3;
}
public void Update()
{
a[0] = 10;
}
}
3 ответа
Модификатор Readonly применяется к фактическому типу, которому он присвоен. Таким образом, в этом случае он назначается экземпляру типа Array, но не элементам, присутствующим внутри него.
Вот почему, да, вы все еще можете изменить значение элемента, но код как
public void Update()
{
a[0] = new int[3];
}
потерпит неудачу, так как вы собираетесь изменить экземпляр типа Array (а не его содержимое)
Надеюсь это поможет.
readonly
делает массив неизменным, а не элементы массива. readonly
означает, что вы можете назначить массив a
поле inline или только в конструкторе. Но это не мешает никому изменять содержимое каждого элемента массива.
Если вы сделаете содержимое этого массива доступным только для чтения, сделайте вот так
public readonly int[] a;
ReadOnlyCollection<int> result = Array.AsReadOnly(a);
public Class1()
{
a = new int[3];
a[0] = 1;
a[1] = 2;
a[2] = 3;
}
public void Update()
{
result[0] = 10; // Compile Time Error Here
}