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; }


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; }
}

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; }
}

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";

13
public string Type { get; set; } 

Tidak ada bedanya dengan melakukan

private string _Type;

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


5

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

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

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.


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; }

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;
}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.