2

パブリックフィールドと、それぞれ_oneおよびOneという名前のパブリックプロパティを含む構造体が定義されています。ここで、メイン関数で構造体をインスタンス化し(新しいオブジェクトを作成しない)、構造体からプロパティを呼び出します。コンパイルを取得しています。割り当てられていないローカル変数Oneの使用を示す時間エラー。ただし、フィールド_oneを呼び出すと、ここで私が行っていることはかなり期待どおりに機能します。

 public struct myStruct
    {
        public int _one;
        public int One
        {
            get { return _one; }
            set { _one = value; }
        }
        public void Display()
        {
            Console.WriteLine(One);
        }
    }



static void Main(string[] args)
        {

            myStruct _struct;
            _struct.One = 2; // Does not works
            _struct._one = 2; // Works fine
        }

誰もがこの背後にある理由を説明できますか、概念を理解できませんでした。

4

3 に答える 3

2

プロパティにアクセスできるようにするには、構造体を初期化する必要があり_structます。それ以外の場合は、デフォルト値があります。

myStruct _struct = new myStruct(); 

ちなみに、可変値型は悪です。

于 2012-11-27T16:48:30.690 に答える
1

これは直感的ではない動作ですが、明確な割り当てチェックのルールで許可されています。C#言語仕様のセクション5.3で非常に詳細に説明されています。この章の最初のキーフレーズは次のとおりです。

上記の規則に加えて、次の規則が構造体型変数とそのインスタンス変数に適用されます。-
インスタンス変数に含まれる構造体型変数が確実に割り当てられていると見なされる場合、インスタンス変数は確実に割り当てられていると見なされます。
-各インスタンス変数が確実に割り当てられていると見なされる場合、構造体型変数は確実に割り当てられていると見なされます。

これを許可するのは後者のルールです。つまり、すべての変数を割り当てることで構造体を初期化することもできます。これらのスニペットを試すことでこれを確認できます。

myStruct _struct = new myStruct();
_struct.Display();   // fine by the 1st bullet

myStruct _struct;
_struct.Display();   // bad

myStruct _struct;
_struct._one = 2;
_struct.Display();   // fine by the 2nd bullet

したがって、フィールドを割り当ててもCS0165を取得できません。これは、変数を割り当てて構造を初期化できないためです。

于 2012-11-27T17:46:29.713 に答える
0

クラス定義で公開フィールドの代わりに読み取り/書き込みプロパティを使用することを好む理由は、構造体には適用されません。これは、継承も更新通知もサポートできないためです。また、構造体のフィールドの可変性は、構造体インスタンスの可変性に依存します。フィールドが公開されているかどうかの。構造体が関連しているが自由に変更可能な変数のグループを表すことになっている場合は、それらの変数をフィールドとして公開するだけです。バッキングフィールドを持つプロパティが読み取り専用であると想定される場合、コンストラクターは、プロパティセッターを介してではなく、バッキングフィールドを直接設定する必要があります。

于 2012-11-27T17:01:54.917 に答える