Обновить только для чтения массив 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
}
Другие вопросы по тегам