我知道如何使用属性并且我知道它们隐式调用底层 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
成员并改变他们的值(value)观。
因此,在我们的示例中,具有只读属性只能防止外部代码更改引用变量的值 _b
, 但它不会阻止外部代码访问 _b’s
成员。
因此,属性似乎只能检测我们是否正在尝试读取或写入位于堆栈上的变量(在我们的例子中为变量 _b
),而它无法检测我们是否也在尝试写入堆栈上的变量(假设此变量是引用类型)指向的对象的成员。
a) 但这不是破坏了拥有只读属性的全部目的吗?如果属性还能够检测我们是否正在尝试访问由 get 访问器返回的对象的成员(假设支持字段是引用类型),这不是更有效吗?
谢谢
最佳答案
不可变性是不可传递的;您不能指望将可变对象放入不可变访问器中是不可变的。
关于c# - 这不会破坏拥有只读属性的全部目的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3056428/