为什么 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;

它不会对方法调用执行此操作,因为它不知道方法调用会改变结构。

道德:尽可能避免可变结构...它们会导致痛苦。