Я знаю, как использовать свойства, и я понимаю, что они неявно вызывают базовые методы доступа 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
первого свойства возвращает ссылку на объект _b
, и как только у нас есть эта ссылка, мы можем получить доступ к _b’s
членами изменить их значения.
Таким образом, в нашем примере наличие свойства только для чтения не позволяет внешнему коду изменять значение ссылочной переменной _b
, но не мешает внешнему коду обращаться к _b’s
членам.
Таким образом, кажется, что свойство может определять только то, пытаемся ли мы прочитать или записать переменную (в нашем случае переменную _b
), расположенную в стеке, тогда как она не может определить,пытаясь также записать в члены объекта, на который указывает переменная в стеке (предполагая, что эта переменная имеет ссылочный тип).
a) Но разве это не умаляет всей цели наличия только для чтениясвойства?Разве не было бы более эффективно, если бы свойства имели возможность также определять, пытаемся ли мы получить доступ к членам объекта, возвращаемого функцией доступа get (при условии, что поле поддержки имеет ссылочный тип)?
спасибо