c#:ゲッター/セッター


109

私はどこかで次のようなものを見て、それが何を意味するのかと思っていました。私はそれらがゲッターとセッターであることを知っていますが、文字列Typeがこのように定義されている理由を知りたいです。私を助けてくれてありがとう。

public string Type { get; set; }


4
これは、このを見て、自動プロパティと呼ばれている:msdn.microsoft.com/en-us/library/bb384054.aspx
Allov

これは、という名前のプロパティの定義"Type"ですSystem.string。その.NETタイプはです。それ以上は何もありません。
Jon

2
自動プロパティの名前をリフレクションクラスSystem.Typeと混同しているのではないかと思います。 msdn.microsoft.com/en-us/library/system.type.aspx
eandersson 2011

回答:


178

それらは自動実装されたプロパティです(略して自動プロパティ)です。

コンパイラーは、以下の単純な実装に相当するものを自動生成します。

private string _type;

public string Type
{
    get { return _type; }
    set { _type = value; }
}

2
@barlopはグーグルから来た人で、手がかりがなく、何を更新する必要がありますか?M.ハッサンズはあなたが言っていることの答えですか?ありがとう。
エテノシティ

1
@Aethenosityを振り返って、大丈夫だと思います。.ゲッターセッターの例について考えていました。質問者には、はるかに簡潔なゲッターセッターの有効なケースがあります(1つのライナーとして/ 2番目のフィールドは不要)public int b { get { return b * 2; } } 。2番目のフィールドは不要です。しかし、ボディ付きのセッターがある場合は、2番目のフィールドが必要だと思います。そして、これは本体付きのセッターを示しています。質問者のワンライナーと同じですが。
barlop

2
@Aethenosityにはc#7もあります。これにより、セッターに本体がある場合でも2番目のフィールドが必要ですが、=>構文があり、returnキーワードがありません。それは私が考えていたものではありませんでしたが。2番目のフィールドは時々必要であることがわかりましたが、私は2番目のフィールドが不要であることを念頭に置いていました。ここの例では2番目のフィールドは必要ありません( 'cosのないデフォルトのセッターはこれを行います)が、回答者はそれを挿入しました(セッターボディと2番目のフィールド)。第二分野はやっていた。
barlop

33

それは自動プロパティであり、これはこれの省略表記です:

private string type;
public string Type
{
  get { return this.type; }
  set { this.type = value; }
}

4
...バッキングフィールドにアクセスできないことを除いて。
ヴラド

7
...これがバッキングフィールドと呼ばれる理由です。
Teoman Soygul、2011

5
それにもかかわらず、あなたは<Type>k__BackingField反射のようにそれを見ることができるはずです。
ヴラド

25

C#6の場合:

これで、フィールドと同じように自動プロパティを宣言できるようになりました。

public string FirstName { get; set; } = "Ropert";

読み取り専用の自動プロパティ

public string FirstName { get;} = "Ropert";



5

これは自動的にサポートされるプロパティであり、基本的には

private string type;
public string Type
{
   get{ return type; }
   set{ type = value; }
}

4

これらは自動プロパティと呼ばれます。

http://msdn.microsoft.com/en-us/library/bb384054.aspx

機能的に(およびコンパイルされたILに関して)、それらはバッキングフィールドを持つプロパティと同じです。


1
クラス内のprivate _typeまたはtypeを引き続き参照できますか、それともTypeだけを使用できますか?
mikey

2
いいえ。ただし、autoプロパティの修飾子を指定できます。public string Type {get; プライベートセット; }
ジェフ

この場合、_typeにアクセスできません。
セキュリティハウンド

1
したがって、その場合、this.Type = "foo"; 大丈夫ですが、instance.Type = "foo"の外側から; これらの自動小道具は間違いなく言語に役立つ追加です。ありがとう。
マイキー2011

1

これは古い質問ですが、C#6のリリースで、プライベートプロパティに対してこのようなことができるようになりました。

public constructor()
{
   myProp = "some value";
}

public string myProp { get; }

2
C#6で直接初期値を設定できます:public string myProp {get; } = "some value")コンストラクタなし;
M.ハッサン2016

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.