{Get; nedir Ayarlamak; } sözdizimi C #?


577

ASP.NET MVC öğreniyorum ve İngilizce belgeleri okuyabilir, ama gerçekten bu kodda neler olduğunu anlamıyorum:

public class Genre
{
    public string Name { get; set; }
}

Bu ne anlama geliyor { get; set; }?


4
Genel olarak hatırla - ayarlayıcılar nesnenizi değişebilir yapar, kötü bir fikir. getters ihlal "Bir nesneye ne yapması gerektiğini söyleyin, bilgi istemeyin ve kendiniz manipüle edin". Genel olarak, ayarlayıcıları ve alıcıları varsayılan olarak eklemeyin. Sıklıkla onlara ihtiyacınız olacak, ancak eklemeden önce her zaman gerçek bir ihtiyaç bulmalısınız. Özellikle ayarlayıcılar üretim kodunda neredeyse hiç kullanılmamalıdır (mümkün olan her yerde değişmezlik için çaba gösterin ve mutasyon gerektiğinde sizin için mutasyon yapmasını isteyin, bir değer belirlemeyin).
Bill K

8
Sadece bir şey eklemek için ... Eğer koymazsanız {get; set;}bir Alan yaratırsınız ama koyarsanız {get; set;}bir Mülk yaratırsınız . Bir mülk sahibi olmak, özellikle Reflection ile çalışırken bazı şeyleri kolaylaştırabilir.
Seichi

@Seichi bir get-setter kullanarak da bir Alan oluşturur, ancak bu alan gizlidir, özel olarak bildirilir ve otomatik oluşturulan özellikler tarafından değiştirilir; bunların hepsi derleyici tarafından yapılmıştır.
Jonathan Ramos

1
oto mülkler özel alanların amacını bozmuyor mu?
mireazma

Yanıtlar:


567

Bu, auto özelliği olarak adlandırılır ve aslında aşağıdakiler için bir kısayoldur (derleyici tarafından benzer kod üretilecektir):

private string name;
public string Name
{
    get
    {
        return this.name;
    }
    set
    {
        this.name = value;
    }
}

93
Klaus, bu kodla ne olacağını açıklayabilir misin? Daha kapsamlı bir açıklamadan faydalanabilir.
TylerH

3
Yani, sadece emin olmak için: =operatörü aşırı yüklediysem, ama sadece belirli bir eleman için, değil mi?
Hi-Angel

9
Neden özel değişkene ihtiyacımız var? : - / ayıp.
Oliver Dixon

2
@TylerH Özel değişkenin nedeni kapsüllemedir, get / set değişkeni almak veya ayarlamak için bir "geçit" sağlar. Get / setters kullanmamanın birçok nedeni olmasına rağmen, "gate" özel değişkenin kapsüllenmesini bozabilir. (erişilebilir olmamalıdır)
Alexander

4
Belli olabilir ama steno olmadığını ben açıklamak istiyorum anlamıyla bunun için bir kısaltmadır. Yani, hiçbir özel değişken nameoluşturulmaz. Sınıf içindeki bu özel değişkene başvurmaya çalışırsanız, başarısız olur. Nasıl C # yaptığını emin değilim, ama kodunuzda erişemez, adı olmayan özel bir değişken varmış gibi davranır.
Denziloe

432

Anladığım kadarıyla { get; set; }, @Klaus ve @Brandon gibi "destek alanı" olan bir özellik yazmak için kısayol olduğu gibi bir "otomatik özellik" olduğunu. Yani bu durumda:

public class Genre
{
    private string name; // This is the backing field
    public string Name   // This is your property
    {
        get => name;
        set => name = value;
    }
}

Ancak benim gibiyseniz - yaklaşık bir saat kadar önce - hangi özelliklerin ve erişimcilerin gerçekte olduğunu anlamıyorsunuz ve bazı temel terminolojileri de en iyi şekilde anlayamıyorsunuz. MSDN böyle şeyler öğrenmek için harika bir araçtır, ancak yeni başlayanlar için anlaşılması her zaman kolay değildir. Bu yüzden burada daha ayrıntılı olarak açıklamaya çalışacağım.

getve setolan erişimcileri erişim veri ve bilgi için they mümkün anlamına özel (genellikle bir ila alanları destek alanında ) ve genellikle gelen bunu kamu özellikleri (yukarıdaki örnekte görebileceğiniz gibi).

Yukarıdaki ifadenin oldukça kafa karıştırıcı olduğunu inkar etmek yok, bu yüzden bazı örneklere bakalım. Diyelim ki bu kod müzik türlerine atıfta bulunuyor. Yani Tarz sınıfı içinde farklı müzik türleri isteyeceğiz. Diyelim ki 3 türümüz var: Hip Hop, Rock ve Country. Bunu yapmak için , sınıfın yeni örneklerini oluşturmak üzere Sınıf adını kullanırız .

Genre g1 = new Genre(); //Here we're creating a new instance of the class "Genre"
                        //called g1. We'll create as many as we need (3)
Genre g2 = new Genre();
Genre g3 = new Genre();

//Note the () following new Genre. I believe that's essential since we're creating a
//new instance of a class (Like I said, I'm a beginner so I can't tell you exactly why
//it's there but I do know it's essential)

Artık Tür sınıfının örneklerini oluşturduğumuza göre, tür adlarını yukarıda ayarlanan 'Ad' özelliğini kullanarak ayarlayabiliriz.

public string Name //Again, this is the 'Name' property
{ get; set; } //And this is the shorthand version the process we're doing right now 

Aşağıdakileri yazarak 'g1' adını Hip Hop olarak belirleyebiliriz

g1.Name = "Hip Hop";

Burada olanlar biraz karmaşık. Sanki daha önce adı geçen, getve setaksi takdirde erişmek mümkün olmaz o özel alanlardan erişim bilgileri. getyalnızca o özel alandaki bilgileri okuyabilir ve geri gönderebilir . setyalnızca o özel alana bilgi yazabilir . Ancak her iki ile bir özellik sağlayarak getve setbiz yapabiliyoruz bu işlevlerin her ikisini birden yapın. Ve yazarak g1.Name = "Hip Hop";özellikle setName özelliğimizdeki işlevi kullanıyoruz

setadlı örtük bir değişken kullanır value. Temel olarak bunun anlamı, içinde "değer" gördüğünüz her seferinde setbir değişken anlamına gelir; "değer" değişkeni. Yazdığımızda , bu durumda olan değişkeni geçmek g1.Name =için kullanıyoruz . Yani aslında şöyle düşünebilirsiniz:=value"Hip Hop"

public class g1 //We've created an instance of the Genre Class called "g1"
{
    private string name;
    public string Name
    {
        get => name;
        set => name = "Hip Hop"; //instead of 'value', "Hip Hop" is written because 
                              //'value' in 'g1' was set to "Hip Hop" by previously
                              //writing 'g1.Name = "Hip Hop"'
    }
}

Yukarıdaki örneğin gerçekte kodda yazılmadığına dikkat etmek önemlidir. Daha çok arka planda neler olduğunu gösteren varsayımsal bir kod.

Şimdi biz ettik set arasında g1 örneğinin Adı Türe , sanırım inanıyorum olsun yazılı tarafından isim

console.WriteLine (g1.Name); //This uses the 'get' function from our 'Name' Property 
                             //and returns the field 'name' which we just set to
                             //"Hip Hop"

ve bunu çalıştırırsak "Hip Hop"konsolumuza gireriz.

Bu açıklama amacıyla örneği çıktılarla da tamamlayacağım

using System;
public class Genre
{
    public string Name { get; set; }
}

public class MainClass
{
    public static void Main()
    {
        Genre g1 = new Genre();
        Genre g2 = new Genre();
        Genre g3 = new Genre();

        g1.Name = "Hip Hop";
        g2.Name = "Rock";
        g3.Name = "Country";

        Console.WriteLine ("Genres: {0}, {1}, {2}", g1.Name, g2.Name, g3.Name);
    }
}

Çıktı:

"Genres: Hip Hop, Rock, Country"

18
Şahsen ben sadece böyle yorumset{name = value;} // 'value' here is equal to "Hip Hop"
maksymiuk

2
@iLoveUnicorns, veri soyutlama amacıyla orada . Destek alanı gerçek verileri içerir. Özellik tanımı aslında verinin getve setyöntemleriyle nasıl erişileceğini tanımlar . Sağladığım bağlantı, sayfanın üst kısmında John Guttag'dan mükemmel bir alıntı yaptı. Kitabını okumanızı ve hatta bu ücretsiz çevrimiçi kursa
Josie Thompson

2
Biz sadece kullanamazsınız: public class Genre{public string Name;} yerine: public class Genre{ public string Name { get; set; }}. Yani, neden {get; Ayarlamak; }?
user2048204

1
Endişem zaten yankılandı gibi görünüyor. Bu şekilde bildirirseniz: "public string Name {get; set;}" ve şu şekilde erişirseniz: g1.Name = "Hip Hop"; - o zaman Nesne Yönü nerede? Sözde "destek alanı" na bile ihtiyacım yok. Destek alanı, endişelendiğim kadarıyla bile yok. Çünkü sadece kamusal alana erişiyorum. Ve eğer kamusal alan "kamu" ise OO uyumlu değildir. Hepimiz COBOL'a geri dönelim.
Baruch Atta

1
Harika cevap, ama bilgiçlikçiysek, “set” bir mutator, bir erişimci değil.
pythlang

100

Bunlar otomatik özellikler

Temel olarak destek alanına sahip bir özellik yazmanın başka bir yolu.

public class Genre
{
    private string _name;

    public string Name 
    { 
      get => _name;
      set => _name = value;
    }
}

7
"Destek alanı" ne denir?
kn3l

4
@stackunderflow: Destek alanı verilerin saklandığı yerdir. (kullanırken ne döndürülür ve kullanmaya getdevam edilir set). Dolap gibi hangi getve setkapısını açar.
Grant Thomas

5
@stackunderflow: Bu cevapta destek alanı _name. Automatic özelliğinde, destek alanı gizlidir.
Justin

36

Bunu yapmanın kısa yolu:

public class Genre
{
    private string _name;

    public string Name
    {
      get => _name;
      set => _name = value;
    }
}

33

Özel bir veri üyeleri oluşturmanıza gerek kalmaması için veri üyelerini herkese açık olarak göstermek için bir kısayoldur. C # sizin için özel bir veri üyesi oluşturur.

Bu kısayolu kullanmadan veri üyelerinizi herkese açık hale getirebilirsiniz, ancak daha sonra veri üyesinin uygulamasını bir mantığa sahip olacak şekilde değiştirmeye karar verdiyseniz, arayüzü kırmanız gerekir. Kısacası, daha esnek bir kod oluşturmak için bir kısayoldur.


2
Kelsey - bu sözdiziminin onu nasıl daha "esnek" bir kod haline getirdiğini açıklayabilir misiniz? Görmüyorum. Ayarlayıcıya veya alıcıya herhangi bir "mantık" eklerseniz, eter durumunda (özel veri ile veya özel veri olmadan) arabirimi olduğu gibi kırabilir ve kodlamaya ihtiyacınız olur.
Baruch Atta

18

Temel olarak, bu bir kısayol:

class Genre{
    private string genre;
    public string getGenre() {
        return this.genre;
    }
    public void setGenre(string theGenre) {
        this.genre = theGenre;
    }
}
//In Main method
genre g1 = new Genre();
g1.setGenre("Female");
g1.getGenre(); //Female

5
Bu soruya cevap vermiyor. OP özellikleri hakkında konuşuyordu.
15:00

6
Get ve Set özelliklerini biliyorum, daha iyi anlamaya yardımcı olan bir örnek
Jirson Tavera


6

Bunlar, ortak mülk Adı için erişimcilerdir.

Bunları, bir Tür örneğinde söz konusu özelliğin değerini almak / ayarlamak için kullanırsınız.


6

Bu, Otomatik Olarak Uygulanan bir Özelliktir. Temelde, C # 'da bir sınıf için özellikler oluşturmanın, kendileri için özel değişkenleri tanımlamak zorunda kalmanın kısa bir yoludur. Normalde bir değişkenin değerini alırken veya ayarlarken ekstra bir mantık gerekmediğinde kullanılırlar.

MSDN'nin Otomatik Uygulanan Özellikler Programlama Kılavuzu hakkında daha fazla bilgi edinebilirsiniz .


6
  • Get / set deseni, somutlaştırılmış bir sınıfın özellik örneğinin ayarı ('set') veya alınması ('get') sırasında mantığın eklenmesine izin veren bir yapı sağlar; Emlak.

  • Bir mülkün yalnızca 'get' erişimcisi olabilir ve bu özelliği salt okunur yapmak için yapılır

  • Bir alma / ayarlama deseni uygularken, içine bir değerin yerleştirilebileceği ve bir değerin çıkarılabildiği bir kap olarak bir ara değişken kullanılır. Ara değişkene genellikle bir alt çizgi eklenir. bu ara değişkene yalnızca alma / ayarlama çağrıları ile erişilebilmesini sağlamak için özeldir. Cevabı get / set uygulamak için en sık kullanılan sözdizimi kurallarını gösterdiğinden Brandon'ın cevabına bakın.


5

Bu, Tür türünde bir değişken oluşturduğunuzda, değişkene özellik olarak erişebileceğiniz anlamına gelir

Genre oG = new Genre();
oG.Name = "Test";

5
Otomatik uygulanan özellikleri kullanmadığınızda, yine de bu şekilde erişebilirsiniz. yani AIP dışarıdan erişim ile değil, bir sınıf içindeki beyanla ilgilidir.
abatishchev

4

Bu { get; set; }sözdizimine otomatik özellikler, C # 3.0 sözdizimi adı verilir

Derlemek için Visual C # 2008 / csc v3.5 veya üstünü kullanmalısınız. Ancak, .NET Framework 2.0 kadar düşük hedefler içeren çıktıları derleyebilirsiniz (bu özelliği desteklemek için çalışma zamanı veya sınıf gerekmez).


4

Visual Studio'da, Xbir sınıfta bir özellik tanımlarsanız ve bu sınıfı yalnızca bir tür olarak kullanmak isterseniz, projenizi oluşturduktan sonra "Alan X hiçbir zaman atanmaz ve her zaman varsayılan değeri vardır. değeri " .

Bir ekleyerek { get; set; }için Xmülk, bu uyarıyı almazsınız.

Ayrıca, Visual Studio 2013 ve üst sürümlerinde, { get; set; }bu özelliğe ilişkin tüm başvuruları görebilirsiniz.

resim açıklamasını buraya girin


4

Temelde bir steno. public string Name { get; set; }Birçok örnekte olduğu gibi yazabilirsiniz , ancak yazabilirsiniz:

private string _name;

public string Name
{
    get { return _name; }
    set { _name = value ; } // value is a special keyword here
}

Neden kullanılır? Bir özelliğe erişimi filtrelemek için kullanılabilir, örneğin adların sayı içermesini istemezsiniz.

Sana bir örnek vereyim:

private class Person {
    private int _age;  // Person._age = 25; will throw an error
    public int Age{
        get { return _age; }  // example: Console.WriteLine(Person.Age);
        set { 
            if ( value >= 0) {
                _age = value; }  // valid example: Person.Age = 25;
        }
    }
}

Resmi olarak Otomatik Uygulanan Özellikler ve ( programlama kılavuzu ) okumak için iyi alışkanlığı denir . Ben de öğretici video tavsiye C # Özellikler: Neden "get" ve "set" kullanın .


2

Get set, mülke erişim değiştiricileridir. Get özelliği alanını okur. Set, özellik değerini ayarlar. Get, salt okunur erişim gibidir. Set yalnızca Yazma erişimi gibidir. Özelliği okuma yazma olarak kullanmak için hem get hem de set kullanılmalıdır.


1
Ben set olsun erişim değiştiriciler, infact onlar erişimci olduğunu düşünüyorum. Erişim değiştiriciler şöyledir: genel, özel, dahili vb.
Rohit Arora

1

Özellik sağ tarafta (RHS) göründüğünde Get çağrılır Özellik '=' sembolünün sol tarafında (LHS) göründüğünde Set çağrılır

Otomatik olarak uygulanan bir özellik için, destek alanı sahnenin arkasında çalışır ve görünmez.

Misal:

public string Log { get; set; }

Otomatik olarak uygulanmayan bir mülk için destek alanı açıktır, özel kapsamlandırılmış bir değişken olarak görülebilir.

Misal:

private string log;

public string Log
{
    get => log;
    set => log = value;
}

Ayrıca, burada 'getter' ve 'setter' farklı 'destek alanını' kullanabilir.


Bu sorulan soruya cevap vermiyor gibi görünüyor.
TylerH

Get & set çalıştırıldığında ipucu verildi. Yukarıda belirtilen tüm cevaplar, get & set için destek alanının aynı olduğu izlenimini verir. Ancak durum böyle değil. Bu yüzden cevabım ana soru ile çok ilgili. Umarım bana katılıyorsun.
Bala

Sorunun sorduğu otomatik olarak oluşturulan bir mülk için alıcı ve ayarlayıcı için kullanılan farklı destek alanları olamaz; sadece bir destek alanı var. Otomatik olmayan bir mülk için (sorunun sormadığı) kavramsal olarak hiç bir destek alanı bile olmayabilir. Ayrıca, bir atama operatörünün sol tarafında bir alıcı ile ve bir atama operatörünün sağ tarafında bir ayarlayıcı ile bir program yazabilirsiniz. Yani tüm bu bilgiler sadece soruyu cevaplamakla kalmıyor, aynı zamanda yanlış.
Servy

0

Özel değişkenleri tanımlayın

Oluşturucu içinde ve verileri yükleyin

Sabit oluşturdum ve sabitten Seçili Liste sınıfına veri yükleyin.

public  class GridModel
{
    private IEnumerable<SelectList> selectList;
    private IEnumerable<SelectList> Roles;

    public GridModel()
    {
        selectList = from PageSizes e in Enum.GetValues(typeof(PageSizes))
                       select( new SelectList()
                       {
                           Id = (int)e,
                           Name = e.ToString()
                       });

        Roles= from Userroles e in Enum.GetValues(typeof(Userroles))
               select (new SelectList()
               {
                   Id = (int)e,
                   Name = e.ToString()
               });
    }

  public IEnumerable<SelectList> Pagesizelist { get { return this.selectList; } set { this.selectList = value; } } 
  public IEnumerable<SelectList> RoleList { get { return this.Roles; } set { this.Roles = value; } }
  public IEnumerable<SelectList> StatusList { get; set; }

}

0

Özellik, özel değişkeni bir sınıfın diğer üyelerinden ayıran bir katman gibidir. Dış dünyadan bir mülk sadece bir alan gibi hissediyor.

public class Person
{
    public string FirstName { get; set; }

    public string LastName { get; set; }

    public string FullName => $"{FirstName} {LastName}";
}

public class Person
{
    public string FirstName { get; set; }

    public string LastName { get; set; }

    public string FullName { get { return $"{FirstName} {LastName}"; } }
}

FullName bir özelliktir. Oklu olan bir kısayoldur. Dış dünyadan FullName'e şu şekilde erişebiliriz:

var person = new Person();
Console.WriteLine(person.FullName);

Arayanlar, FullName'i nasıl uyguladığınız umurumda değildir. Ancak sınıf içinde FullName'i istediğiniz gibi değiştirebilirsiniz.

Daha ayrıntılı açıklama için Microsoft Belgelerine göz atın:

https://docs.microsoft.com/en-us/dotnet/csharp/properties

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.