请查看以下代码:
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
}
}
在这种情况下,有没有办法让非const Inflate()方法有效?如果它不修改我的objetc,这意味着当我访问它时,我的 Rect 对象被深深复制了?
这些是我的审讯,但真正的问题是:为什么访问者如果有设置者也不允许修改返回的对象?
答案 0 :(得分:4)
System.Windows.Rect
是一个结构。因此,属性返回结构的副本,而不是对对象的引用的副本。
修改返回的值不会执行任何操作,因为它是实际存储在属性的支持字段中的值的副本。如果您尝试直接进行修改,编译器实际上会给您一个错误,因为它理解了问题:
// Error: CS1612 Cannot modify the return value of 'Foo.s' because it is not a variable
s.X = 10;
它不会对方法调用执行此操作,因为它不知道方法调用会改变结构。
道德:尽可能避免可变结构......它们会引起疼痛。