c #: alıcı / ayarlayıcı


109

Bir yerde aşağıdakine benzer bir şey gördüm ve bunun ne anlama geldiğini merak ediyordum. Alıcı ve ayarlayıcı olduklarını biliyorum, ancak Tip dizgesinin neden bu şekilde tanımlandığını bilmek istiyorum. Bana yardım ettiğin için teşekkürler.

public string Type { get; set; }


4
Buna Otomatik Mülk denir, şuna bir bakın: msdn.microsoft.com/en-us/library/bb384054.aspx
Allov

Bu, "Type".NET türü olan bir özelliğin tanımıdır System.string. Bundan daha fazlası yok.
Jon

2
Auto-Property'nin isimlendirmesini System.Type Reflection sınıfıyla karıştırıyor olabileceğini düşünüyorum. msdn.microsoft.com/en-us/library/system.type.aspx
eandersson

Yanıtlar:


178

Bunlar Otomatik Uygulanan Özelliklerdir (kısaca Otomatik Özellikler).

Derleyici, aşağıdaki basit uygulamanın eşdeğerini otomatik olarak oluşturacaktır:

private string _type;

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

2
@barlop hiçbir ipucu olmadan google'dan gelen biri olarak nelerin güncellenmesi gerekiyor? M. Hassans ne demek istediğinizi yanıtlıyor mu? Teşekkürler.
Aethenosity

1
@Aethenosity geçmişe bakıldığında bence sorun değil .. Getter setter örnekleri açısından düşünüyordum. Sorgulayıcı, çok daha kısa olan geçerli bir alıcı ayarlayıcı durumuna sahiptir (tek satırlık / ikinci alan gerekmez). Ayrıca public int b { get { return b * 2; } } gerekli ikinci alan da yazamazsınız . Ama bir vücut ile pasörünüz olduğunda, ikinci alana ihtiyacınız olduğunu düşünüyorum. Ve bu, vücudu olan bir pasör gösteriyor. Soruyu soranın tek satırıyla aynı şeyi yapsa da.
barlop

2
@Aethenosity ayrıca, ayarlayıcının bir gövdesi olduğunda ikinci alana ihtiyaç duyduğunuzdan emin olduğunuz, ancak bir =>sözdizimine sahip olduğu ve dönüş anahtar kelimesi olmadığı için c # 7 de vardır . Gerçi aklımdaki bu değildi. İkinci alanın gereksiz olduğunu aklıma getirmiştim, ancak o zamandan beri ikinci alanın bazen gerekli olduğunu buldum. Buradaki örnekte ikinci alan gerekli değildir (çünkü gövdesi olmayan bir varsayılan ayarlayıcı bunu yapmazdı), ancak cevaplayıcı soruyu soran kişiye satırının ne olduğunu açıklamak için (ayarlayıcı gövdesi ve ikinci alan) ikinci alan yapıyordu.
barlop

33

Bu bir otomatik mülkiyettir ve bunun kısaltmasıdır:

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

4
... destek alanına erişilememesi dışında.
Vlad

7
... bu yüzden ona destek alanı deniyor .
Teoman Soygul

5
Yine de, bunu <Type>k__BackingFieldyansımada olduğu gibi görebilmelisiniz .
Vlad

25

C # 6'da:

Artık otomatik özellikleri yalnızca bir alan olarak bildirmek mümkündür:

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

Salt Okunur Otomatik Özellikler

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

13
public string Type { get; set; } 

Yapmaktan farklı değil

private string _Type;

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


5

Otomatik olarak desteklenen bir özelliktir, temelde

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

4

Bunlara otomatik özellikler denir.

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

İşlevsel olarak (ve derlenmiş IL açısından), destek alanları olan özelliklerle aynıdırlar.


1
Yine de sınıf içinde private _type veya türe referans verebilir misiniz, yoksa yalnızca Type'ı mı kullanırsınız?
mikey

2
Hayır, ANCAK auto özelliği için değiştiriciyi belirtebilirsiniz: public string Type {get; özel küme; }
Jeff

Bu durumda _type'a erişemezsiniz.
Security Hound

1
Yani bu durumda this.Type = "foo"; Tamam olmalı, ancak örnek dışından.Type = "foo"; olmayacak .. Bu otomatik aksesuarlar kesinlikle dile yardımcı olacak bir eklentidir. Teşekkürler.
mikey

1

Bunun eski bir soru olduğunu biliyorum, ancak C # 6'nın piyasaya sürülmesiyle, artık özel mülkler için buna benzer bir şey yapabilirsiniz.

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

public string myProp { get; }

2
başlangıç ​​değerini doğrudan C # 6'da ayarlayabilirsiniz: public string myProp {get; } = "bir değer") yapıcı olmadan;
M.Hassan

1

Ayrıca bir lambda ifadesi de kullanabilirsiniz

public string Type
{
    get => _type;
    set => _type = value;
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.