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

C# 为什么get访问器不允许修改返回的对象?,c#,properties,accessor,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 } } 在

请查看以下代码:

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
    }
}
在这种情况下,有没有办法使non-const Inflate()方法起作用?如果它不修改我的对象,这意味着当我访问它时,我的Rect对象被深度复制了


这些是我的疑问,但真正的问题是:如果也有setter,为什么访问器不允许修改返回的对象?
System.Windows.Rect
是一种结构。因此,属性返回结构的副本,而不是对象引用的副本

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

// Error: CS1612 Cannot modify the return value of 'Foo.s' because it is not a variable
s.X = 10;
对于方法调用它不这样做,因为它不知道方法调用会改变结构


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

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

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

// Error: CS1612 Cannot modify the return value of 'Foo.s' because it is not a variable
s.X = 10;
对于方法调用它不这样做,因为它不知道方法调用会改变结构


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

充气
返回一个新对象,您必须将其分配给
s
@Sergii:您在哪里看到的?Doc说它返回void:这只是避免可变结构的另一个例子…@sstan你是对的-我得到的第一个链接是该方法的静态版本。@Sergii:你刚刚建议了一种解决方法:
s=System.Windows.Rect.Inflate(s,1.5,1.5)
,谢谢<代码>充气返回必须分配给
s
@Sergii的新对象:您在哪里看到的?Doc说它返回void:这只是避免可变结构的另一个例子…@sstan你是对的-我得到的第一个链接是该方法的静态版本。@Sergii:你刚刚建议了一种解决方法:
s=System.Windows.Rect.Inflate(s,1.5,1.5)
,谢谢!