0
public class TouchableArea  {
public Rect rect;   

public Rect Rect{
    get{return rect;}
    set{rect = value;}
}
}

以上是我的课。Rect是一个结构并具有Set设置新值的功能。当我使用该属性为 rect 设置一个新值时,没有任何反应,但是当我直接使用 rect 时,一切都很好。

TouchableArea t = new TouchableArea();
t.Rect.Set(newValue);//Through property, nothing happens
t.rect.Set(newValue);//Directly access, it works.

这是否意味着通过属性调用函数是非法的?

4

2 回答 2

4

当您更改属性时,IL 会调用一个返回对象的方法。由于它是一个“值”对象,因此t.Rect不会返回 object rect,而是返回一个副本。因此,您正在修改rect.

于 2012-04-23T03:13:48.017 回答
1

从根本上说,修改结构的属性是行不通的,因为结构是值类型,分配时的值类型只会接收副本。因此,不能将更改级联回原始。

虽然这个问题可以这样合理化。一些编译器编写者可以代表我们执行魔术。这就是 Miguel de Icaza 试图向 C# 提出的那种事情

http://tirania.org/blog/archive/2012/Apr-11.html

如果 VB.NET 可以在属性上有一个 ByRef(他们的语言设计者没有对为什么它不可行进行合理化,他们只是围绕它编写代码,感觉就像魔术一样;可能会出现某种泄漏的抽象通过促进这样做,但对他们来说,可以说是利大于弊);如果他们接受他的提议,复制的结构的属性也可以修改

于 2012-04-23T03:23:04.857 回答