12

プロジェクト内で新しいクラスを定義する場合、そのための正しい/ベストプラクティスは何ですか?過去に私は次のようなクラスを作成しました:

  public class MyClass
  {
      public string FirstName  {get; set;}
      public string LastName  {get; set;}
  }

通常、プロジェクト内でコレクションを作成するには、このようなクラスを使用します。

ただし、c#シャープについて学び、読み続けると、クラスが次のように定義されている例が表示されます。

    class MyClass //not set to public
    {
        private string  _firstName; //first defined as fields
        private string _lastName;

        public string FirstName  // then defined as properties 
        {
            get { return  _firstName; }
            set { _firstName = value; }
        }
        public string LastName
        {
            get { return _lastName; }
            set { _lastName = value; }
        }
    }

最初のアプローチは定義が正しくありませんか、それともこれはC#内で受け入れられている省略形ですか?ベストプラクティスとして、常に最初にプライベートフィールドでクラスを定義し、次にget / set to a valueを使用してそれらをプロパティとして定義する必要がありますか?

私はC#で独学で学んでおり、開発への適切なアプローチを改善し、よりよく理解しようとしているので、質問します。そこにあるいくつかのサンプルとチュートリアルは、1つのアプローチが好まれる理由(または完了)他の上に。

前もって感謝します

4

4 に答える 4

16

あなたの最初の例:

public class MyClass
{
    public string FirstName  {get;  set;}
    public string LastName  {get;  set;}
}

具体的には、c# 3.0 で導入されたAuto-Implemented Propertiesです。どちらのフォーマットも間違っていません。1つ目は、より「省略形」です。

より複雑な型では、古いスタイルを使用して、次のようなプライベート変数から特定のプロパティまたは値のみを公開すると便利な場合があります。

public class MyClass
{
    private Dictionary<int, List<string>> _someInternalDictionary;

    public int MyValuesCount
    {
        get
        {
            return _someInternalDictionary.Values.Count;
        }
    }

}

大まかな例ですが、うまくいけば私の考えが理解できます。

于 2010-07-09T18:55:19.243 に答える
14

最初の例の短縮構文 (自動実装されたプロパティ) は C# 3.0 で導入され、それ以前は有効ではありませんでした。コンパイラは実際に、バッキング フィールドを含む完全な形式に変換します。

C# 3.0 より前では、プロパティを定義する唯一の正しい方法は、バッキング フィールドを使用することでした。

C# 3.0 でも、プロパティにロジックが必要な場合は、バッキング フィールドを使用するように変換する必要があります。

つまり、ダム プロパティ (何もしないもの) の場合は、自動プロパティを使用します。これらは、コードをより単純で読みやすくし、変換できるようにします。

于 2010-07-09T18:54:55.137 に答える
5

あなたが持っている2つのクラスは、実際には機能と機能が同じです。

自動プロパティ構文 (最初のクラス) の目的は、基本的に、2 番目のクラスと本質的に同じものを宣言する簡単な方法を提供することです。

getter または setter メソッドにコードを追加する必要があるまで (プロパティの新しい値を検証するなど)、最初のバージョンを使用します。

自動プロパティ構文の目的は 2 つあります。一部は Linq を容易にするために追加され、一部はパブリック フィールドではなくプロパティを宣言することを簡単にするために追加されました。

自動プロパティ (最初のバージョン) を使用してクラスを宣言すると、コードに対してコンパイルされた他のすべてのアセンブリは、クラスがこれらのものをフィールドではなくプロパティとして宣言していることを認識します。後で検証などのコードを追加する必要があると判断した場合、それらの他のアセンブリは引き続きプロパティを見つけるため、再コンパイルする必要はありません。

于 2010-07-09T18:57:09.043 に答える
0

get と set に Access Modifier を使用することもできます...

public {ReturnType} MyProperty { {Access Modifier}get; {Access Modifier}set; }

そして、あなたはすでに についての知識を持っていると思いますAccess Modifier

于 2010-07-10T09:15:16.197 に答える