1

C# の多くのコード サンプルにはgetsetコード ブロックが含まれています。それらの目的は何ですか?これらのブロックがサンプル コードに表示されているのでコピーしましたが、それが何に使用されるのかわかりません。誰かが私にこれを説明してもらえますか?

4

5 に答える 5

7

ゲッターとセッターを使用すると、関数のペアを 1 つのプロパティに組み合わせることができ、明示的な関数呼び出しのような構文の代わりに、メンバー アクセス式または代入のような構文を使用できます。

ここに小さな例があります:

internal class Example 
{
    private int x;

    public int GetX() => x;
    public void SetX(int value) => x = value;
}

...

var e = new Example();

e.SetX(123);
Console.WriteLine($"X = {e.GetX()}");

彼らはあなたにこれをさせます:

internal class Example 
{
    public int X { get; set; }
}

...

var e = new Example();
e.X = 123;
Console.WriteLine($"X = {e.GetX()}");

2 番目のコード スニペットの構文はX、変数のように見えるため、読みやすくなっています。同時に、2 番目のスニペットは同じレベルのカプセル化を提供し、実装をプロパティの背後に隠すことができます。

于 2013-09-23T18:20:20.930 に答える
5

これのことですか?:

public int SomeValue { get; set; }

これは基本的にこれの構文上の省略形です。

private int someValue;
public int SomeValue
{
    get { return someValue; }
    set { someValue = value; }
}

それ自体は基本的にこれの省略形です:

private int someValue;
public int GetSomeValue() { return someValue; }
public void SetSomeValue(int value) { someValue = value; }

(ただし、コンパイラはこれを行うときに、ものの名前に異なる規則を使用します。)

OOP に関連するので、これはデータのカプセル化です。オブジェクトは、データを直接公開するのではなく、データを隠して機能を公開する必要があるという考えです。someValueしたがって、必ずしもオブジェクトの外部から直接変更する必要はありません。オブジェクトでメソッドを呼び出し、値を指定します。内部的には、オブジェクトはそのデータの実際のストレージを処理します。

于 2013-09-23T18:21:16.563 に答える
2
public int foo { get; set; }

これはプロパティを定義します。基本的にはパブリック フィールドのようなものですが、リフレクションとなると異なります。C#/.NET では、パブリックなものにプロパティを使用するのが一般的です。Java の getter/setter メソッドと比較できます。

すばらしいことに、カスタムのget/set コードを使用したりsetget. これにより、プロパティ アクセスの代わりにメソッド呼び出しの見苦しさを感じることなく、getter/setter メソッドの利点を得ることができます。

public int foo {
    get { return this.some_foo; }
    set { this.some_foo = value; this.run_code_after_change(); }
};
于 2013-09-23T18:19:54.470 に答える
0

getおよびsetは一種の構文糖衣です。これは、パラメーターを取得しない関数を実装するためのより読みやすい方法です。たとえば、検証 (セッターで) やゲッターでのフィールドの計算を挿入できます。そのような機能では、括弧は役に立ちません。

于 2013-09-23T18:21:25.250 に答える
0

英語では、セッターとゲッターです。

カプセル化が原因でセッターとゲッターが発生したことを独学で学べることを願っています。

繰り返しになりますが、setter と getter を使用すると、定義したプロパティにアクセスできます。

于 2013-09-23T18:19:04.613 に答える