3

以下の 2 つの POCO クラスの実装の違いは何ですか?

class Test
    {
        int _var1;
        string _var2;

        public int var1
        {
            get
            {
                return _var1;
            }
            set
            {
                _var1 = value;
            }
        }

        public string var2
        {
            get
            {
                return _var2;
            }
            set
            {
                _var2 = value;
            }
        }
    }

class Test2
    {
        int _var1;
        string _var2;

        public int var1
        {
            get;
            set;
        }

        public string var2
        {
            get;
            set;
        }
    }
4

7 に答える 7

6

1 つ目はバッキング フィールドを使用した通常のプロパティの実装で、2 つ目は自動実装されたプロパティであり、コンパイラがバッキング フィールドを生成するため、フィールドは使用されません。

自動実装されたプロパティにより、バッキング フィールドとボイラープレート コードを記述してそれらにアクセスする必要がなくなります。コンパイラは、クラス内の他のフィールド名と衝突しない C# の名前付けできないバッキング フィールドを IL に作成します。

バッキングフィールドの名前が原因で自動プロパティのシリアル化の問題について聞いたことがありますが、最終的な効果は同等です。質問を見つけてください...申し訳ありませんが、現時点では見つけられないようです。

于 2013-09-13T08:35:31.970 に答える
2

機能的には違いはありません。コンパイラは、2 番目から最初のバージョンを生成します。

于 2013-09-13T08:36:08.120 に答える
1

2 番目の実装は と呼ばAuto-Propertiesれ、フレームワーク 3.0 で導入された機能です。

最初の実装は、フレームワーク 3.0 より前の従来の方法でした。

自動プロパティの例については、このリンクを参照してください。内部では、自動プロパティがバッキング フィールドを生成します。

それらの使用に対する議論については、このリンクも見てください。

于 2013-09-13T08:34:59.397 に答える
1

最初の実装では、基礎となるものに直接アクセスできます。

しかし実際には、2 番目の実装は、他のバッキング プロパティを除いて、舞台裏で最初の実装を生成します。

于 2013-09-13T08:35:11.323 に答える
1

プロパティは機能的には同じですが、2 番目のプライベート変数_var1_var2は使用されません。

最初に、プロパティを使用してプライベート変数のインスタンスを返します。

2 つ目では、コンパイラがフィールドを生成し、バックグラウンドでそれらの割り当てを処理するため、明示的に宣言する必要はありません。

于 2013-09-13T08:35:14.830 に答える
0

どちらも開発者にとってまったく同じです

于 2013-09-13T08:38:51.410 に答える
0

2 番目のケースでは、コンパイラが自動的にフィールドを追加し、プロパティをラップします。これは基本的に、バッキング フィールドで行うのと同じです。

于 2013-09-13T08:36:49.423 に答える