2012-04-23 43 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(沒有通過他們的語言設計者做了爲什麼不能合理化可行的,他們只是圍繞它編碼,而且感覺像是魔法;可能會通過促進這種方式產生某種漏洞的抽象,但對他們來說,它們的優勢遠遠超過這些缺點);複製的結構的屬性也可以修改,如果他們會接受他的建議

相關問題