c #: pengambil / penyetel

109

Saya melihat sesuatu seperti berikut ini di suatu tempat, dan bertanya-tanya apa artinya. Saya tahu mereka getter dan setter, tapi ingin tahu mengapa Tipe string didefinisikan seperti ini. Terima kasih telah membantuku.

public string Type { get; set; }
Maya
sumber
4
Ini disebut Properti Otomatis, lihat ini: msdn.microsoft.com/en-us/library/bb384054.aspx
Allov
Ini adalah definisi dari properti bernama "Type", jenis .NET di antaranya adalah System.string. Tidak ada yang lebih dari itu.
Jon
2
Saya pikir dia mungkin bingung menamai Auto-Property dengan kelas Refleksi System.Type. msdn.microsoft.com/en-us/library/system.type.aspx
eandersson

Jawaban:

178

Itu adalah Properti yang Diimplementasikan Otomatis (disingkat Properti Otomatis).

Kompiler akan secara otomatis menghasilkan persamaan dari implementasi sederhana berikut:

private string _type;

public string Type
{
    get { return _type; }
    set { _type = value; }
}
Justin Niessner
sumber
2
@barlop sebagai seseorang yang datang dari google, tanpa petunjuk, apa yang perlu diperbarui? Apakah M. Hassans menjawab apa yang Anda maksud? Terima kasih.
Aethenosity
1
@Aethenosity dalam retrospeksi Saya pikir tidak apa-apa .. Saya berpikir tentang contoh getter setter. Penanya memiliki kasus valid pengambil penyetel yang jauh lebih ringkas (sebagai satu liner / tidak diperlukan bidang kedua) .. Anda juga dapat menulis public int b { get { return b * 2; } } bidang kedua tidak diperlukan. Tapi saya pikir ketika Anda memiliki setter dengan body maka Anda membutuhkan field kedua. Dan yang ini menunjukkan seorang setter dengan tubuh. Meskipun itu sama dengan kalimat satu penanya.
barlop
2
@Aethenosity ada juga c # 7 di mana yakin Anda masih membutuhkan bidang kedua ketika penyetel memiliki tubuh, tetapi memiliki =>sintaks dan tidak ada kata kunci kembali. Meskipun bukan itu yang ada dalam pikiran saya. Saya berpikir bahwa bidang kedua tidak diperlukan, meskipun sejak itu saya menemukan bahwa bidang kedua terkadang diperlukan. Dalam contoh di sini, bidang kedua tidak diperlukan ('cos penyetel default tanpa tubuh akan melakukan ini), tetapi penjawab meletakkannya di (badan penyetel dan bidang kedua), untuk menjelaskan kepada penanya apa baris mereka tanpa bidang kedua sedang dilakukan.
barlop
33

Itu adalah properti-otomatis dan itu adalah notasi singkatan untuk ini:

private string type;
public string Type
{
  get { return this.type; }
  set { this.type = value; }
}
Teoman Soygul
sumber
4
... kecuali bidang dukungan tidak dapat diakses.
Vlad
7
... itulah sebabnya disebut bidang dukungan .
Teoman Soygul
5
Namun demikian, Anda harus dapat melihatnya sebagai <Type>k__BackingFieldrefleksi.
Vlad
25

Dalam C # 6:

Sekarang dimungkinkan untuk mendeklarasikan properti-otomatis hanya sebagai sebuah field:

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

Properti Otomatis Hanya-Baca

public string FirstName { get;} = "Ropert";
M. Hassan
sumber
13
public string Type { get; set; } 

Tidak ada bedanya dengan melakukan

private string _Type;

public string Type
{    
get { return _Type; }
set { _Type = value; }
}
Security Hound
sumber
5

Ini adalah properti yang didukung secara otomatis, pada dasarnya setara dengan

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

Ini disebut properti otomatis.

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

Secara fungsional (dan dalam istilah IL yang dikompilasi), mereka sama dengan properti dengan bidang pendukung.

Jeff
sumber
1
Apakah Anda masih dapat mereferensikan private _type atau type dalam kelas, atau Anda hanya menggunakan Type?
mikey
2
Tidak, TAPI Anda dapat menentukan pengubah untuk properti otomatis: string publik Type {get; set pribadi; }
Jeff
Anda tidak akan dapat mengakses _type dalam kasus ini.
Security Hound
1
Jadi dalam hal ini this.Type = "foo"; seharusnya OK, tapi dari luar instance.Type = "foo"; tidak akan .. Alat peraga otomatis ini jelas merupakan tambahan yang bermanfaat untuk bahasa. Terima kasih.
mikey
1

Saya tahu ini adalah pertanyaan lama tetapi dengan dirilisnya C # 6, Anda sekarang dapat melakukan sesuatu seperti ini untuk properti pribadi.

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

public string myProp { get; }
Anonim
sumber
2
Anda dapat menyetel nilai awal langsung di C # 6: string publik myProp {get; } = "beberapa nilai") tanpa konstruktor;
M. Hassan
1

Anda juga bisa menggunakan ekspresi lambda

public string Type
{
    get => _type;
    set => _type = value;
}
Ahmad Aghazadeh
sumber