为什么get accessor不允许修改对象返回?

时间:2015-12-11 16:51:36

标签: c# properties accessor

请查看以下代码:

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 对象被深深复制了?

这些是我的审讯,但真正的问题是:为什么访问者如果有设置者也不允许修改返回的对象?

1 个答案:

答案 0 :(得分:4)

System.Windows.Rect是一个结构。因此,属性返回结构的副本,而不是对对象的引用的副本。

修改返回的值不会执行任何操作,因为它是实际存储在属性的支持字段中的值的副本。如果您尝试直接进行修改,编译器实际上会给您一个错误,因为它理解了问题:

// Error: CS1612 Cannot modify the return value of 'Foo.s' because it is not a variable
s.X = 10;

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

道德:尽可能避免可变结构......它们会引起疼痛。