2010-11-27 12 views
2
class MyClas 
{ 
    public System.Windows.Point p; 
    public void f() 
    { 
     p.X = 0; 
    } 
} 

このコードは完全に機能します。この1つは、コンパイル・エラーが発生すると同時に

プロパティと変数の違い

(「それは変数ではないので、Pの戻り値を変更することはできません」):

class MyClas 
{ 
    public System.Windows.Point p {get; set;} 
    public void f() 
    { 
     p.X = 0; 
    } 
} 


違いは何ですか?

答えて

7

あなたはmutable struct which is evilを使用しています。

プロパティは、元のフィールドへの参照ではなく、構造体のコピーを返します。したがって、変更はコピーされた構造体にのみ影響します。
単純なケース(呼び出し側セッター)では、コンパイラーが間違いをキャッチします。複雑な場合(構造体を変更するメソッドを呼び出す)、コンパイラはそれをキャッチせず、あなたのコードは黙って失敗します(つまり、コピーが変更され、元のものは変更されません)。

回避方法は、p=new Point(x,y)

+0

+1です。構造体のコピー – TalentTuner

関連する問題