25

申し訳ありませんが、私が初心者である場合、この疑問があります。なぜプライベート変数を使用し、それらをプロパティを使用して設定するのですか?

プロパティを単独で使用できないのはなぜですか?

私はこのような状況について話している

private string _testVariable;

public string MyProperty
{
    get { return _testVariable;}
    set {_testVariable = value;}
}

私は単に使用することを考えています

public string MyProperty { get; set; } 

冗長なプライベート変数はなぜですか? これら2つの戦略は異なりますか?誰でもこれに光を当ててください。

ありがとう

4

9 に答える 9

31

あなたの例は意味的に同じです。簡潔なプロパティ宣言構文 ( だけ{ get; set; }) は、C# 3.0 で使用できるショートカットです。コンパイラは、実際には、最初の例のように、プライベート バッキング変数と単純なゲッターとセッターを作成します。

getter と setter を作成するだけの場合 (そして、どちらかが発生しても実際には何も起こらない場合)、簡潔な構文は適切なオプションです。値を設定するときに他のアクション (たとえば、コントロールの再描画) を実行する必要がある場合は、完全な構文が必要です。

于 2009-12-25T17:27:00.180 に答える
16

なぜ冗長なプライベート変数なのか?これらの2つの戦略は異なりますか?誰でもこれに光を当ててください。

変数の読み取り/書き込みだけを行う場合は、いいえ。それ以外の場合、プライベート変数が必要になる理由は2つあります。

データ検証

// Data validation
public class IntWrapper
{
    private int _value;
    public int Value
    {
        get { return _value; }
        set
        {
            if (value < 0) { throw new Exception("Value must be >= 0"); }
            _value = value;
        }
    }
}

ゲッター/セッターは、基盤となるデータストアをまとめます

public class StringBuffer
{
    List<char> chars = new List<char>();

    // Wraps up an underlying data store
    public string Value
    {
        get { return new String(chars.ToArray()); }
        set { chars = new List<char>(value.ToCharArray()); }
    }

    public void Write(string s) { Write(chars.Count, s); }

    public void Write(int index, string s)
    {
        if (index > chars.Count) { throw new Exception("Out of Range"); }
        foreach(char c in s)
        {
            if (index < chars.Count) { chars[index] = c; }
            else { chars.Add(c); }
            index++;
        }
    }
}
于 2009-12-25T18:14:31.933 に答える
2

あなたが与える2番目の例:

public string MyProperty { get; set; }

.Net フレームワークの以降のバージョンでのみ使用可能 (v3.0 以降と思われます)

最初の例では、returnおよび代入ステートメントにブレークポイントを設定できます。これにより、プロパティが割り当てられたり読み取られたりしたときにデバッガーが中断されます。

于 2009-12-25T17:25:24.830 に答える
2

最初のコード スニップでは、プライベート クラスの状態を変更できます。プライベート ステートをプロパティにラップすると、実装が隠されるので便利です。後で実装を変更できますが、プロパティ (外部インターフェイス) は変更されない場合があります。

たとえば、setter 内で単一の文字列を設定する代わりに、何らかのプライベート ストアに文字列を設定するとします。ファイルに書き込むか、共有メモリに書き込みます。または、パスワードの場合のように、文字列のハッシュのみを計算し、それをまったく保存しない場合もあります。

2 番目のコード スニップの自動プロパティは、プライベート変数とはまったく関係ありません。最初のスニップで使用された明示的なプロパティの設計と同様に、自動プロパティの設計により、将来の変更が可能になります。たとえば、その変更の一環として、自動プロパティから明示的に実装されたプロパティに変換できます。

于 2009-12-25T17:25:48.980 に答える
2

マシェッシュ、私たちはどこかから始めなければなりませんでした! この例でプライベート変数とプロパティについて尋ねました:

private string _testVariable;

public string MyProperty
{
    get { return _testVariable;}
    set {_testVariable = value;}
}

-or-

public string MyProperty { get; set; }

考慮しましたか:

public string MyProperty { get; private set; }

プロパティ getter/setter にスコープを適用できます。. . . クール。そうそう 。. . 定義クラス内でこのタイプのプロパティを使用する場合 (コンストラクターなど)、先頭に「this.」を追加します。- したがって、割り当ては「this.MyProperty = "An Assigned String";」のようになります。これにより、意図がより明確になります。. .

于 2010-01-01T03:46:52.007 に答える
0

プロパティは、基本的にフィールドのラッパーです。このラッパーにより、外部から変数を使用できるようになります。C#3.0 では、public string MyProperty { get; set; }コンパイラがプライベート変数を自動的に宣言し、そのための set メソッドも取得するように、単純にプロパティを宣言できます。プロパティを宣言しているクラス内で計算を実行する必要がある場合は、そのためにプライベート フィールドを使用する必要があります。

于 2009-12-25T17:28:21.860 に答える
0

プライベート変数を使用する必要があるコードを後で追加する可能性があるかどうか、最初にコードを記述する時期がわからない場合があります。もちろん、必要に応じて後で追加できます。後で使用することを想定して、プライベート変数を自動的に作成します。

これは、最初のコーディング時に完全な実装がわからない可能性がある大規模なエンタープライズ アプリまたは急速に進化するアプリ (アジャイル) に関連する可能性があります。

于 2009-12-25T17:33:55.673 に答える
0

バッキング変数が必要ない場合は嫌いです。必要以上に複雑になるからです。

明らかに、ゲッターまたはセッターで何か特別なことをする必要がある場合は、シュガーではなく完全なセマンティック形式を使用する必要があります。

また、プロパティがどのように設定または使用されるかをデバッグする方法としてプロパティを使用するのが好きです。これは、リフレクションのためにそれほど明白ではない場合があり、それが私がプロパティを使用する理由の 1 つです。

バッキング変数がクラス内でプロパティ自体またはバッキング変数によって内部的にアクセスされる可能性があり、コーダーに正しいアクセス方法を伝えるものがない場合、コードをデバッグしようとするのはイライラします。

プロパティだけでなくバッキング変数にも内部的にアクセスできるので、どちらが正しい方法ですか? それは明らかではありません...

于 2013-07-09T13:31:13.197 に答える
-1

これは C# 言語とは関係ありませんが、アプリケーションとは関係ありません。

プロパティを使用する理由の 1 つは、多くのフレームワークで「特別」として扱われることです。たとえば、Silverlight と WPF は、フィールドではなくプロパティにバインドします。

于 2010-01-01T04:04:03.407 に答える