web-dev-qa-db-ja.com

{getとは何ですか?セット; C#の構文?

私はASP.NET MVCを学んでいます、そして私は英語の文書を読むことができます、しかし、私は本当にこのコードで何が起こっているのか理解していません:

public class Genre
{
    public string Name { get; set; }
}

これはどういう意味ですか?{ get; set; }

510
kn3l

これはいわゆるautoプロパティであり、基本的に次のものの省略形です(同様のコードがコンパイラによって生成されます)。

private string name;
public string Name
{
    get
    {
        return this.name;
    }
    set
    {
        this.name = value;
    }
}
510

それで私がそれを理解するように{ get; set; }は@Klausと@Brandonが言ったような「自動プロパティ」であり、「補助フィールド」を持つプロパティを書くことの省略表現です。だからこの場合:

public class Genre
{
    private string name; // This is the backing field
    public string Name   // This is your property
    {
        get => name;
        set => name = value;
    }
}

しかし、あなたが私のようなものであれば - 1時間ほど前に - あなたは properties accessors が何であるか本当に理解できません。そして、あなたはまた、いくつかの基本的な用語について最もよく理解していません。 MSDNはこのようなことを学ぶのに最適なツールですが、初心者にとって理解しやすいものではありません。だから私はここでこれをより詳細に説明しようとするつもりです。

getset アクセサ 、つまりprivateフィールドのデータと情報にアクセスできることを意味します(通常は 補助フィールド から)通常はpublic properties から行います(上の例でわかるように)。

上記のステートメントがかなり混乱を招くことを否定するものではありませんので、いくつかの例を見てみましょう。このコードが音楽のジャンルを参照しているとしましょう。そのため、ジャンルのクラスの中では、さまざまなジャンルの音楽が必要になります。ヒップホップ、ロック、カントリーの3つのジャンルが欲しいとしましょう。これを行うには、そのクラスの新しいインスタンスを作成するためにクラスの名前を使用します。

Genre g1 = new Genre(); //Here we're creating a new instance of the class "Genre"
                        //called g1. We'll create as many as we need (3)
Genre g2 = new Genre();
Genre g3 = new Genre();

//Note the () following new Genre. I believe that's essential since we're creating a
//new instance of a class (Like I said, I'm a beginner so I can't tell you exactly why
//it's there but I do know it's essential)

ジャンルクラスのインスタンスを作成したので、上記で設定した 'Name' property を使用してジャンル名を設定できます。

public string Name //Again, this is the 'Name' property
{ get; set; } //And this is the shorthand version the process we're doing right now 

次のように書くことで、 'g1'の名前をHip Hopに設定できます。

g1.Name = "Hip Hop";

ここで起こっていることは一種の複雑です。私が前に言ったように、getsetはプライベートフィールドからの情報にアクセスします。 getは、そのプライベートフィールドからの情報のみreadを返し、それを返すことができます。 setは、そのプライベートフィールド内の情報だけをwriteにできます。しかし、getsetの両方を持つプロパティを持つことで、これら両方の機能を実行できます。そしてg1.Name = "Hip Hop";を書くことで、Nameプロパティのset関数を使用しています。

setvalueという暗黙の変数を使用します。基本的にこれが意味するのはsetの中に "value"がある時はいつでもそれは変数を参照することです。 "値"変数g1.Name =を書くとき、value変数を渡すために=を使っています。この場合、それは"Hip Hop"です。それで、あなたは本質的にこのように考えることができます:

public class g1 //We've created an instance of the Genre Class called "g1"
{
    private string name;
    public string Name
    {
        get => name;
        set => name = "Hip Hop"; //instead of 'value', "Hip Hop" is written because 
                              //'value' in 'g1' was set to "Hip Hop" by previously
                              //writing 'g1.Name = "Hip Hop"'
    }
}

上の例は実際にはコードに書かれていないことに注意することは重要です。これは、バックグラウンドで何が起こっているのかを表す、より架空のコードです。

これで、set ジャンル のg1インスタンスの名前ができたので、次のように記述することで名前をgetできると思います。

console.WriteLine (g1.Name); //This uses the 'get' function from our 'Name' Property 
                             //and returns the field 'name' which we just set to
                             //"Hip Hop"

これを実行すると、コンソールに"Hip Hop"が表示されます。

そのため、この説明の目的のために、出力も含めて例を完成させます。

using System;
public class Genre
{
    public string Name { get; set; }
}

public class MainClass
{
    public static void Main()
    {
        Genre g1 = new Genre();
        Genre g2 = new Genre();
        Genre g3 = new Genre();

        g1.Name = "Hip Hop";
        g2.Name = "Rock";
        g3.Name = "Country";

        Console.WriteLine ("Genres: {0}, {1}, {2}", g1.Name, g2.Name, g3.Name);
    }
}

出力:

"Genres: Hip Hop, Rock, Country"
397
Josie Thompson

それらは 自動プロパティ

基本的に、バッキングフィールドを使用してプロパティを記述する別の方法.

public class Genre
{
    private string _name;

    public string Name 
    { 
      get => _name;
      set => _name = value;
    }
}
94
Brandon

これはこれをする短い方法です:

public class Genre
{
    private string _name;

    public string Name
    {
      get => _name;
      set => _name = value;
    }
}
36
froeschli

プライベートデータメンバーを明示的に作成する必要がないように、データメンバーをパブリックとして公開するためのショートカットです。 C#はあなたのためのプライベートデータメンバーを作成します。

このショートカットを使わずにデータメンバーを公開するだけでも構いませんが、データメンバーの実装を変更して何らかのロジックを持たせる場合は、インターフェイスを解除する必要があります。つまり、より柔軟なコードを作成するための近道です。

27
Kelsey

基本的に、それはのショートカットです:

class Genre{
    private string genre;
    public string getGenre() {
        return this.genre;
    }
    public void setGenre(string theGenre) {
        this.genre = theGenre;
    }
}
//In Main method
genre g1 = new Genre();
g1.setGenre("Female");
g1.getGenre(); //Female
15
Jirson Tavera

その 自動実装プロパティ C#の場合。

10
Daniel A. White

これは自動実装プロパティです。基本的には、C#でクラスのプロパティを作成する簡単な方法で、プライベート変数を定義する必要はありません。これらは通常、変数の値を取得または設定するときに追加のロジックが不要な場合に使用されます。

MSDNの 自動実装プロパティプログラミングガイド でもっと読むことができます。

6
Dusda

これらはパブリックプロパティNameのアクセサです。

それらを使用して、ジャンルのインスタンス内のそのプロパティの値を取得または設定します。

6
TimCodes.NET
  • Get/setパターンは、インスタンス化されたクラスのプロパティインスタンスの設定( 'set')または取得( 'get')中にロジックを追加できるようにする構造を提供します。財産。

  • プロパティは 'get'アクセサのみを持つことができます。これはそのプロパティを読み取り専用にするために行われます。

  • Get/setパターンを実装するとき、中間変数は値を入れたり値を抽出したりできるコンテナとして使用されます。中間変数は通常、アンダースコアが前に付きます。この中間変数は、そのget/set呼び出しを介してのみアクセスできるようにするためにプライベートです。彼の回答はget/setを実装するために最も一般的に使用されている構文規約を示しているので、Brandonからの回答を参照してください。

5
Chris Halcrow

つまり、ジャンル型の変数を作成すると、その変数にプロパティとしてアクセスできるようになります。

Genre oG = new Genre();
oG.Name = "Test";
5
David Brunelle

Visual Studioで、クラスでプロパティXを定義し、このクラスを型としてのみ使用したい場合、プロジェクトのビルド後に "フィールドXは割り当てられません。常にデフォルト値は " です。

{ get; set; }Xプロパティに追加しても、この警告は表示されません。

さらに、Visual Studio 2013以降のバージョンでは、{ get; set; }を追加することで、そのプロパティへのすべての参照を見ることができます。

enter image description here

4
Omid Ebrahimi

そのような{ get; set; }構文は自動プロパティ、C#3.0構文と呼ばれます。

コンパイルには、Visual C#2008/csc v3.5以降を使用する必要があります。しかし、.NET Framework 2.0と同じくらい低いターゲットを持つ出力をコンパイルすることができます(この機能をサポートするためにランタイムやクラスは必要ありません)。

4
linquize

取得セットはプロパティへのアクセス修飾子です。プロパティフィールドを読み取ります。プロパティ値を設定します。取得は読み取り専用アクセスのようなものです。セットは書き込み専用アクセスのようです。このプロパティを読み取り書き込みとして使用するには、getとsetの両方を使用する必要があります。

2
Ashraf Abusada

プロパティが右側(RHS)に表示されるとGetが呼び出されます。プロパティが左側(LHS)に表示されるとSetが呼び出されます。

自動実装プロパティの場合、バッキングフィールドはシーンの背後で機能し、表示されません。

例:

public string Log { get; set; }

自動実装されていないプロパティの場合は、バッキングフィールドが最前面にあり、プライベートスコープ変数として表示されます。

例:

private string log;

public string Log
{
    get => log;
    set => log = value;
}

また、「getter」と「setter」は異なる「バッキングフィールド」を使用できることに注意してください。

1
Bala

それは基本的に速記です。public string Name {get; set;}のように書くことができますが、書くこともできます。

private string _name;

public string Name
{
    get { return _name; }
    set { _name = value ; } // value is a special keyword here
}

なぜそれが使われるのですか?プロパティへのアクセスをフィルタするために使用できます。たとえば、名前に数字を含めたくない場合などです。

例を挙げましょう。

private class Person {
    private int _age;  // Person._age = 25; will through an error
    public int Age{
        get { return _age; }  // example: Console.WriteLine(Person.Age);
        set { 
            if ( value >= 0) {
                _age = value; }  // valid example: Person.Age = 25;
        }
    }
}

正式にはAuto-Implemented Propertiesと呼ばれ、( プログラミングガイド )を読む習慣があります。私はチュートリアルビデオもお勧めします C#プロパティ:なぜ "get"と "set" を使うのか。

1
Randel