Я знаю, как использовать свойства, и я понимаю, что они неявно называют базовые get
и set
аксессоры, в зависимости от того, пишем ли мы или читаем из свойства.
static void Main(string[] args)
{
A a = new A();
(a.b).i = 100;
}
class A
{
private B _b = new B();
public B b
{
get { return _b; }
}
}
class B
{
public int i;
}
В самом деле, код (a.b).i = 100;
заключается в том, что первое свойство get
accessor возвращает ссылку на объект _b
, и как только у нас есть эта ссылка, мы можем получить доступ к членам _b’s
и изменить их значения.
Таким образом, в нашем примере свойство только для чтения запрещает внешнему коду изменять значение ссылочной переменной _b
, но это не предотвращает доступ внешнего кода к членам _b’s
.
Таким образом, кажется, что свойство может только определить, пытаемся ли мы читать или записывать переменную (в нашем случае переменную _b
), находящуюся в стеке, тогда как ее не удалось определить, пытались ли они также писать члены объекта, к которому указывает переменная в стеке (при условии, что эта переменная имеет ссылочный тип).
a) Но разве это не разрушает всю цель наличия свойств только для чтения? Не было бы более эффективным, если бы свойства имели возможность также обнаруживать, пытались ли получить доступ к элементам объекта, возвращаемым get accessor (при условии, что поле поддержки имеет ссылочный тип)?
Благодарю вас