为什么get访问器不允许修改返回的对象
本文关键字:返回 对象 修改 不允许 get 访问 为什么 | 更新日期: 2023-09-27 18:26:30
请查看下面的代码:
public class Foo
{
public System.Windows.Rect s
{
get;
set;
}
public Foo()
{
s = new System.Windows.Rect(-2, -3, 4, 5); // affects object
s.Inflate(1.5, 1.5); // no effect at all
}
}
在这种情况下,有没有一种方法可以使非常量充气()方法工作?如果它不修改我的objet,这意味着当我访问Rect对象时,它会被深度复制吗?
这些是我的疑问,但真正的问题是:如果也有setter,为什么访问器不允许修改返回的对象
System.Windows.Rect
是一个结构。因此,结构的副本由属性返回,而不是对对象的引用的副本。
修改返回的值没有任何作用,因为它是实际存储在属性的backing字段中的值的副本。如果你试图直接进行修改,编译器实际上会给你一个错误,因为它了解问题:
// Error: CS1612 Cannot modify the return value of 'Foo.s' because it is not a variable
s.X = 10;
它对方法调用不这样做,因为它不知道方法调用会使结构发生变异。
寓意:尽可能避免可变结构。。。它们会引起疼痛。