2

C# 4.0 セクション 7.5.5 より。

M が値型で宣言されたインスタンス関数メンバーの場合:

  • [...]
  • E が変数として分類されない場合、E の型の一時ローカル変数が作成され、E の値が変数に割り当てられます。E は、その一時ローカル変数への参照として再分類されます。一時変数は M 内でこのようにアクセスできますが、他の方法ではアクセスできません。したがって、E が真の変数 (真の変数とは何か...? ) である場合にのみ、呼び出し元は M がこれに加えた変更を観察できます。

エリック・リッパートは次のように続けています。

この点は、可変性と値によるコピーのセマンティクスの組み合わせが問題を引き起こす可能性のある別の方法を示しています。たとえば、コンストラクターの実行後、読み取り専用フィールドは変数として分類されません。したがって、値型の読み取り専用フィールドの内容を変更するメソッドを呼び出そうとすると成功しますが、実際にはコピーが変更されます! 可変値型を完全に避けることで、これらの問題を回避してください。

Eric が説明したシーンを再現するにはどうすればよいですか? 以下を試しました。私が期待するようにそれはエラーになります:

    struct A
    {
        public readonly int mutableReadonlyField;

        public A(int originalValue)
        {
            mutableReadonlyField = originalValue;
        }

        public A MethodThatMutatesTheContentsOfAReadOnlyField(int mutate)
        {            
            this.mutableReadonlyField = mutate;//Constructor has run so mutableReadonlyField is a temporary local variable
            //ERROR: A readonly field cannot be assigned to (except in a constructor or a variable initializer)

            A newA = this;//Is this a true variable?
            return newA;
        }
}
4

1 に答える 1

5

私は私のブログでこれの例を示します:

http://ericlippert.com/2008/05/14/mutating-readonly-structs/

問題は、私の文の断片「値型の読み取り専用フィールド」があいまいで誤解を招くことです。フィールドが値型Sであるクラスの読み取り専用フィールドを意味することを意図していましたが、明らかに、より自然な読み取りは、S自体の読み取り専用フィールドと見なすことです。文章を完全に書き直すべきだった。エラーをお詫びします。

他の質問に答えるには、形容詞「true」は不要です。「したがって、Eが変数である場合にのみ、呼び出し元はMがこれに対して行う変更を観察することができます。

于 2013-02-19T15:12:36.213 に答える