为什么 get 访问器不允许修改返回的对象?
Why get accessor does not allow the modification of object returned?
请看下面的代码:
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
}
}
有没有办法让非常量 Inflate() 方法在这种情况下起作用?如果它没有修改我的objetc,那说明我的Rect对象在访问的时候被深度复制了?
这些是我的疑问,但真正的问题是:如果也有 setter,为什么访问者不允许修改返回的对象?
System.Windows.Rect
是一个结构。因此,属性 返回结构的副本,而不是对象引用的副本。
修改返回值没有任何作用,因为它是实际存储在 属性 支持字段中的值的副本。如果你试图直接修改,编译器实际上会给你一个错误,因为它理解问题:
// Error: CS1612 Cannot modify the return value of 'Foo.s' because it is not a variable
s.X = 10;
它不会对方法调用执行此操作,因为它不知道方法调用会改变结构。
道德:尽可能避免可变结构...它们会导致痛苦。
请看下面的代码:
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
}
}
有没有办法让非常量 Inflate() 方法在这种情况下起作用?如果它没有修改我的objetc,那说明我的Rect对象在访问的时候被深度复制了?
这些是我的疑问,但真正的问题是:如果也有 setter,为什么访问者不允许修改返回的对象?
System.Windows.Rect
是一个结构。因此,属性 返回结构的副本,而不是对象引用的副本。
修改返回值没有任何作用,因为它是实际存储在 属性 支持字段中的值的副本。如果你试图直接修改,编译器实际上会给你一个错误,因为它理解问题:
// Error: CS1612 Cannot modify the return value of 'Foo.s' because it is not a variable
s.X = 10;
它不会对方法调用执行此操作,因为它不知道方法调用会改变结构。
道德:尽可能避免可变结构...它们会导致痛苦。