【问题标题】:Why get accessor does not allow the modification of object returned?为什么get访问器不允许修改返回的对象?
【发布时间】:2015-12-11 16:51:36
【问题描述】:

请看下面的代码:

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

【问题讨论】:

  • Inflate 返回一个你必须分配给s的新对象
  • @Sergii:你在哪里看到的? Doc 说它返回 void:Rect.Inflate Method
  • 这只是为什么要避免可变结构的另一个例子......
  • @sstan 你是对的 - 我得到的第一个链接是 Inflate 方法的静态版本。
  • @Sergii:您刚刚提出了一种解决方法:s = System.Windows.Rect.Inflate(s, 1.5, 1.5),谢谢!

标签: c# properties accessor


【解决方案1】:

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-17
    • 2021-04-01
    • 2011-08-15
    • 2011-10-28
    • 1970-01-01
    • 1970-01-01
    • 2010-12-10
    相关资源
    最近更新 更多