为什么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,为什么访问器不允许修改返回的对象

为什么get访问器不允许修改返回的对象

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

修改返回的值没有任何作用,因为它是实际存储在属性的backing字段中的值的副本。如果你试图直接进行修改,编译器实际上会给你一个错误,因为它了解问题:

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

它对方法调用不这样做,因为它不知道方法调用会使结构发生变异。

寓意:尽可能避免可变结构。。。它们会引起疼痛。