Запись в переменные только для чтения
В следующем коде я определил класс
Polynomial
в котором содержится массив, обозначенные знаком readonly
.Я определил свойство read. Свойство записи не может быть определено из-за ошибки компилятора CS0191. Это нормально.
Но если я попытаюсь написать, используя (несуществующее) свойство write, например
p.Coeff[2] = 19
это работает! Как такое может быть?Я сделал еще несколько тестов:
A: я определил индексатор. Компилятор не мешает мне определять свойство записи. Он может быть использован для модификации
readonly
данные участника.Б: я использовал свой
Polynomial
объект p
в качестве параметра метода UsePolynomial
с ключевым словом in
Я понимаю, что аргумент передается по ссылке, чтобы избежать ненужных операций копирования, если объект параметра не будет изменен. Компилятор не должен допускать никаких операций, изменяющих объект. Но нет никакой проблемы изменить p. Любые изменения, внесенные в вызываемый метод, доступны после возврата из вызова.Вот моя программа:
namespace PolyTest { class Program { public class Polynomial { readonly private double[] coeff; public double[] Coeff { get => coeff;} // Does not allow set property because coeff is readonly (CS0191) public double this[int i] { get => coeff[i]; set => coeff[i] = value; } public Polynomial(double c0, double c1, double c2) { coeff = new double[] { c0, c1, c2 }; } } static void Main(string[] args) { Polynomial p = new Polynomial(1, 2, 3); UsePolynomial(p); double val = p[2]; // val = 17 (or 18 if the last line in UsePolynomial is uncommented) } static void UsePolynomial(in Polynomial p) { double val1 = p.Coeff[2]; // val1 = 3 OK double val2 = p[2]; // Val2 = 3 OK p.Coeff[2] = 17; // Why is that possible? //p[2] = 18; // Why is that possible? } } }
Что я уже пробовал:
То, что я попробовал, вы можете прочитать в вопросе.