2017-12-21 40 views
0

この小さなコードの意味を理解できません。C#予期しないプロパティの動作

using System; 

namespace Test 
{ 
    struct Item 
    { 
     public int Value { get; set; } 

     public Item(int value) 
     { 
      Value = value; 
     } 

     public void Increment() 
     { 
      Value++; 
     } 
    } 

    class Bag 
    { 
     public Item Item { get; set; } 

     public Bag() 
     { 
      Item = new Item(0); 
     } 

     public void Increment() 
     { 
      Item.Increment(); 
     } 
    } 

    class Program 
    { 
     static void Main(string[] args) 
     { 
      Bag bag = new Bag(); 
      bag.Increment(); 

      Console.WriteLine(bag.Item.Value); 
      Console.ReadKey(); 
     } 
    } 
} 

コードを読んでいるだけで、私のコンソールに出力として1が読み込まれると思います。コンソールのプリントが0

私は両方

  1. classとしてItemを宣言する代わりにstruct

  2. public Item Item { get; set; }を変換することができ、問題を解決するには、なぜUnfortunely

    私は得ることはありませんpublic Item Item;

この現象がなぜ発生するのか、上記の「解決策」が問題を解決する理由を説明できますか?

+1

[こちら](https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/structs) - 「構造体は値型であり、クラスは参照型です。」 – peeebeee

+0

クラスは、メソッドのような機能を追加した拡張型の構造です。したがって、C#コンパイルは構造とクラスの両方をサポートしますが、2つの異なるオブジェクトを処理するための異なる規則を使用します。クラスItemとプロパティItemの両方に同じ名前を使うべきではありません。だから正しい解決策はアイテムの小文字の 'i'を使うことです:public Item item {get;セット; } – jdweng

+2

@jdweng:あなたはそれをテストしましたか?それでも0が表示されます。 – PaulF

答えて

2

をあなたは、彼らは奇妙な振る舞いを持つことができる可変構造体を使用しないでください。構造体の値を変更することは効果がありません。コピーを直ちに変更することができます。構造体は値型なので、プロパティを設定し、実際に変更するたびにコードが期待どおりに機能しません。コピーではなく元の値(構造体は参照型ではありません)。

可能な解決策:

  1. リファクタリングプロパティ(そのためコピーと仕事の)
  2. クラス
  3. として構造体を作る
(詳細はこの topicを見るために読み取り専用使用など)あなたの構造体は不変ください