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

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

上記は私のクラスです。 Rectは構造体であり、新しい値を設定するための関数Setを持っています。プロパティを使って新しい値をrectに設定すると、何も起こりませんが、rectを直接使うとすべてが問題ありません。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-evil) – Ani

+0

@Ani私はあなたが説明する必要があると思う – Baz1nga

答えて

4

プロパティを変更すると、ILはオブジェクトを返すメソッドを呼び出します。それは "値"オブジェクトであるため、オブジェクトを返さないt.Rectは、コピーを返します。したがって、rectのコピーを変更しています。

1

基本レベルでは、構造体が値型であるため、割り当てられたときに値の型がコピーを受け取るだけなので、構造体のプロパティを変更することはできません。したがって、変更を元に戻すことはできません。

このように問題を合理化することはできますが、いくつかのコンパイラライターは私たちの代わりに魔法を実行することができます。これは、VB.NETは性質上のByRefを持つことができミゲル・デ・Icaza氏は、C#

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

に提案しようとしているものの一種であるならば(それができなかった理由を彼らの言語設計者によって行わ何の合理化はありませんでした実行可能性があり、コードの周りをコーディングしているだけで、魔法のように感じられる;それを促進することによって生じる可能性のある何らかの漏れ抽象があるかもしれないが、それらの利点は、その短所をはるかに上回る。コピーされた構造体のプロパティも変更することができます。