2012-04-24 9 views
3

に保存された構造のプロパティを変更することはできません、私は別のプロパティに格納された構造のプロパティを変更することはできませんと私は考え理由を持っていません:が、私は少し問題を抱えている別のプロパティ

コード:

:私はちょうどにそれを変更した場合ので、私はそれを得ることはありません

Error: Error 3 Cannot modify the return value of '...ViewModel.TilesModel.BNDTileInfo' because it is not a variable 

public struct InfoProTile 
    { 
     public string Nazev { get; set; } 
     public double Hodnota { get; set; } 
     public TypValue TypValue { get; set; } 
     public NavigovatNa NavigovatNa { get; set; } 
    } 

     public InfoProTile BNDTileInfo { get { return bndTileInfo; } set { bndTileInfo = value; } } private InfoProTile bndTileInfo; 

     LoadModel() 
    { 
     ... 
     BNDTileInfo = new InfoProTile(); 
     BNDTileInfo.NavigovatNa = NavigovatNa.MainPage; 
    } 

エラー

これは機能します。誰も私にそれを説明できますか?

+3

C#の次のステップは、値の型と参照の型の違いを理解することです。 – MattDavey

答えて

7

structは値型であるため、プロパティからアクセスすると、structのコピーが返され、元のフィールドdirecltyは返されません。したがって、C#では構造体のコピーを変更することはできません。これは、それが破棄される一時的なオブジェクトだからです。

だから、あなたが呼び出すとき:

BNDTitleInfo.NavigovatNa = ...; 

をそれが最初のプロパティにgetを呼び出し、bndTitleInfoのコピーを返し、その後、NavigovatNa財産とコピーを設定しようとします。 C#はあなたが本当にやりたいことではないのであなた自身をあなたから守っているのでここにエラーを表示します。あなたが直接フィールドを参照しているので、何のコピーが作成されず、コンパイラの問題はありません

bndTitleInfo.NavigovatNa = ...; 

:お電話

しかし、。

可変長の値型は、良いプロパティを作成しないということです(一般に、可変値型を完全に避ける必要があります)。

修正するには、リファレンスタイプ(class)にするか、structを不変にすることができます。これにより、新しい構造体インスタンス全体を割り当てて値を変更する必要があります。

あなたはMSDNの勧告を見れば、struct一般的に小型、論理単一値、不変の構造に最適です:Choosing Between Classes and Structures

7

BNDTileInfoが財産ですので、あなたはデータのクローンを取得します。複製が破棄されると、クローンの変更は失われます。つまり、コードは

var tmp = BNDTileInfo; // tmp is a completely separate clone 
tmp.NavigovatNa = NavigovatNa.MainPage; // change the local clone 
// discard the clone - our change was wasted 

です。コンパイラは大きな問題を引き起こしています。これは、structを意味するを意味します。つまり、値型セマンティクス、別名コピーセマンティクスのためです。

本当の答えはここにあります:それをstructにしないでください。これらの言葉が何であるかわからなくても、私は99%がstructであってはならないと確信しています。もちろん、私はまだあなたが "structInfoProTileと呼んでいる"と言っていたとしても、それがstructであってはならないと確信しています。

それはstruct可変である理由structはその後、正当化することができ、なぜあなたは非常に明確にをを説明することができない限り、BNDTileInfoclassしてください。

関連する問題