0

私が作成した 2 つのプロパティの違い (メリット/デメリット) は何ですか? どちらも正しいようですが、クラスでプロパティを宣言する最良の方法 (実践) は何ですか?

[Serializable]
public class MySample
{
   public string String1 = string.Empty;

   private string _string2 = string.Empty;

   public string String2 
        {
            get { return _string2 ; }
            set { _string2 = value; }
        }
}
4

7 に答える 7

5

のみString2プロパティで、もう一方はパブリックフィールドです。

詳細については、C# .NET 3.5 以降でのプロパティとフィールドの違いを参照してください。不明な場合は、パブリック フィールドではなくプロパティを使用する必要があります。

それがタイプしすぎのように思われる場合は、以下が同等であることを知って喜んでください。

public string String2 { get; set; }

自動プロパティを見る

于 2013-02-20T15:21:48.283 に答える
2

のみString2がプロパティです。String1は単なるパブリック フィールドであり、パブリック フィールドを宣言しないことをお勧めします。

自動プロパティを使用すると、このような単純なプロパティの宣言を簡素化できます。

public string String { get; set; }

getフィールドとプロパティの主な違いは、フィールドが直接アクセスされるのに対し、プロパティはメソッドとメソッドを介して読み書きされることsetです。上記のように自動プロパティを宣言すると、これらgetsetメソッドがコンパイラによって自動的に生成され、実際の値を格納するバッキング フィールドも生成されます。

getおよびメソッドで追加のコードを実行することもできますset。これは、変更通知や検証などによく使用されます。getsetメソッドを、 などのさまざまな可視性に設定でき{ get; private set; }ます。これは、フィールドにないもう 1 つのことです。

String1例のとの使用法がString2同じであっても、バイナリ互換ではないことに注意してください。つまり、フィールドを使用するクラスがあり、そのフィールドをプロパティに変更する場合は、そのクラスを参照するすべてのアセンブリを再コンパイルする必要があります。したがって、最初から (少なくとも自動の) プロパティを使用するのが最善です。

于 2013-02-20T15:21:44.993 に答える
1

最良の方法は、自動プロパティを使用することです。

このような:

public string String1 {get;set;}

読み取りのみを行い、書き込みを行わないプロパティが必要な場合:

public string String1 {get; private set;}

書き込みのみで読み取りは行わないプロパティが必要な場合:

public string String1 {set; private get;}

fields一般に、次のように宣言しないことをお勧めしますpublic

public string _string1; /*bad idea*/
于 2013-02-20T15:21:14.900 に答える
0

1 つ目はプロパティではなく、フィールドです。ここでこれらを実装した方法では、事実上違いはありませんが、一般に、プロパティはより多くの機能を提供します。

C# のフィールドとプロパティの違いは何ですか? を参照し てください。

C# でプロパティを実装する通常の方法は次のとおりです。

public string String1 { get; set; }
于 2013-02-20T15:23:03.590 に答える
0

String1プロパティではなく、パブリック フィールドです。. _ _ static readonly_ String.Empty_

フィールドが今は問題なくても (おそらく最先端ではありませんが)、後でそれをプロパティに変更すると、クラスのバイナリ互換性が失われるため、互換性を破る変更になります。

于 2013-02-20T15:22:31.657 に答える
0

最初に、これは次のとおりです。

public string String1 = string.Empty;

プロパティではなくフィールドです。通常、パブリック フィールドを作成することは避けてください。

2 つ目は、フィールド バッカーを持つプロパティです。これは、設定する前に何らかの検証を行いたい場合に役立ちます。または、値を取得する前にある種の遅延初期化を行うこともできます (明らかに、遅延初期化は、より複雑な型や、頻繁に必要でない場合は値の構築に時間がかかる場合に適しています)。

3 番目のオプションは、次のような自動プロパティです。

public string String3 { get; set; }

これはプロパティのようにコンパイルされるため、コードをフィールドに基づくプロパティに変更して機能を追加する場合、クラスのシグネチャを変更する必要はなく、クラスを使用する既存のコードを更新する必要はありません。フィールドの代わりにプロパティを呼び出す (常にプロパティだったため)

于 2013-02-20T15:22:36.987 に答える
0

YourString1は実際にはフィールドであり、プロパティではありません。次のような自動実装プロパティが必要だったと思います。

public string String1 { get; set; }

あなたString2はフィールドに裏打ちされたプロパティです。この 2 つの主な違いの 1 つは、コンストラクターでプロパティを初期化するのではなく、フィールドを初期化することで、フィールドに基づくプロパティを初期化できることです。もう 1 つの重要な違いは、値が取得または設定されるときに、変更通知の実行など、フィールドに対応するプロパティで他のことを行う機会があることです。

于 2013-02-20T15:24:06.367 に答える