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.
这是否意味着通过属性调用函数是非法的?
答案 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的属性也可以修改,如果他们将接受他的提议