无法通过C#中的属性调用函数?

时间:2012-04-23 03:10:10

标签: c# function properties

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.

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

2 个答案:

答案 0 :(得分:4)

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

的副本

答案 1 :(得分:1)

在基础层面上,修改结构的属性将不起作用,因为结构是值类型,分配时的值类型只是接收副本。因此,无法将更改级联回原始版本。

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

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

如果VB.NET可以在属性上有一个ByRef(他们的语言设计者没有做出合理化的原因,为什么它不可行,他们只是围绕它进行编码,感觉就像魔术一样;可能存在某种漏洞的抽象这可能是通过促进而产生的,但对他们来说,优势远远超过了可以说的缺点);复制的struct的属性也可以修改,如果他们将接受他的提议