2012-04-23 41 views
0
public class TouchableArea { 
public Rect rect; 

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

以上是我的课。 Rect是一个结构体,并具有设置新值的功能Set。当我使用属性来设置一个新的值直到什么都不会发生,但是当我直接使用矩形时,一切都很好。无法通过C#中的属性调用函数?

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

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

+2

请参阅:[为什么可变结构邪恶?](http://stackoverflow.com/questions/441309/why-are-mutable-structs-vil) – Ani 2012-04-23 03:11:37

+0

@Ani我认为你需要说明 – Baz1nga 2012-04-23 03:13:31

回答

4

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

1

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

虽然这个问题可以合理化。一些编译器编写者可以代表我们执行魔术。这是诸如此类的事情,这米格尔奥德伊卡萨试图提出C#

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

如果VB.NET可以对性能的ByRef(没有通过他们的语言设计者做了为什么不能合理化可行的,他们只是围绕它编码,而且感觉像是魔法;可能会通过促进这种方式产生某种漏洞的抽象,但对他们来说,它们的优势远远超过这些缺点);复制的结构的属性也可以修改,如果他们会接受他的建议

相关问题