2009-07-13 8 views
1

タイトルが間違っている可能性がありますので、変更してください。私は自分の疑問を尋ねる方法がわからないので、明らかにコードを見てください。構造体はどのようにプロパティとして定義されていますか?

コメント付きコードを使用すると機能しますが、実際のコードが機能しない理由を知りたいと思います。私はそれが間違っていると確信しているが、どのように修正することができますか?または、これはどのように行われていないのですか?

using System; 

namespace SomethingAwful.TestCases.Structs 
{ 
    public class Program 
    { 
     public static void Main() 
     { 
      Foo f = new Foo(); 
      f.Bar.Baz = 1; 

      Console.WriteLine(f.Bar.Baz); 
     } 
    } 

    public class Foo 
    { 
     public struct FooBar 
     { 
      private int baz; 

      public int Baz 
      { 
       get 
       { 
        return baz; 
       } 
       set 
       { 
        baz = value; 
       } 
      } 

      public FooBar(int baz) 
      { 
       this.baz = baz; 
      } 
     } 

     private FooBar bar; 

     public FooBar Bar 
     { 
      get 
      { 
       return bar; 
      } 
      set 
      { 
       bar = value; 
      } 
     } 

     //public FooBar Bar; 

     public Foo() 
     { 
      this.bar = new FooBar(); 
      //this.Bar = new FooBar(); 
     } 
    } 
} 

答えて

9

構造体は値によってのみコピーされるため、返されたコピーは変更されます。クラスを使用します。

5

スティーブンように使用

Foo.FooBar myFooBar = new Foo.FooBar { Baz = 1 }; 
f.Bar = myFooBar; 

あなたは、構造体のインスタンスを作成し、それにプロパティを設定する必要があると述べました。それ以外の場合は値渡しされます。

+1

を行います。この種の予期しない振る舞いは、structが不変であるという議論の一部です。 –

+0

@スティーブンスディット:の並べ替え。何が起こるべきかは、ミューテータとして特別に宣言された構造体メソッド/プロパティだけが 'this'を変更することを許可され、そのようなメソッド/プロパティの使用は読み取り専用コンテキストでは禁止されることです。さらに、システムは真の参照型プロパティを実装する手段を提供する必要があります。彼らはクロージャよりも安全かつ効率的に実装できますが、残念なことに言語サポートがないとシンタックスが非常に恐ろしいものになります。もし誰かが興味があれば、私はそのテーマについてチャットしたいと思う。 – supercat

+0

@super: 'this'を変更するのではなく、指定された値と異なるコピーを作成することをお勧めします。 –

1

また、構造体を「すでに割り当て済み」と考えることもできるので、new()も必要ありません。代わりに

this.Bar = new FooBar(); 

だけの正しいです

this.Bar.Baz = 1; 
関連する問題