2013-06-26 8 views
9

Jeffrey Richter kitabında (C# 4.0, CLR yoluyla C# 4.0, sayfa 257) kodumu buldum ve neden böyle çalıştığını yanlış anladım.Başlamada yanlış anlama olsun ve ayarlayın: Jeffrey Richter, CLR yoluyla C#

public sealed class Classroom 
    { 
     private List<String> m_students = new List<String>(); 
     public List<String> Students { get { return m_students; } } 

     public Classroom() { } 
    } 

    class Program 
    { 
     static void Main(string[] args) 
     { 
      Classroom classroom = new Classroom { 
       Students = { "Jeff", "Kristin" } 
      }; 

      foreach (var student in classroom.Students) 
       Console.WriteLine(student); 
     } 
    } 

Sonuç:

Jeff 
Kristin 

Gördüğünüz gibi, biz ancak 'Main' işlevinde sadece getter vardır 'Öğrenci' adlı bir erişimci özelliği, (! Ayarlayıcı değil) var,

hep düşündüm
Classroom classroom = new Classroom { 
    Students = { "Jeff", "Kristin" } 
}; 

, işte sol tarafında 'bir değişken: biz 'Sınıfın' değişkeni başlatmak istiyoruz, biz 'Sınıf' türündeki' Öğrenci alanını başlatmanın ifadesi (int i = 1), sonra derleyici ayarlayıcı işlevine ve “sağ taraftaki” (int x = i + 2) ise getter işlevine erişmelidir.

Neden Jeffrey'nin kodunda bu kadar ilginç bir davranış var (sadece benim için olabilir mi?

cevap

22

C 5. spec bölüm 7.6.10.2 Gönderen:

Eşittir işareti sonra bir koleksiyon başlatıcı belirten bir üyesi başlatıcısı gömülü koleksiyonun bir başlatma olduğunu. Alana veya özelliğe yeni bir koleksiyon atamak yerine, başlatıcıda verilen öğeler alan veya özellik tarafından başvurulan koleksiyona eklenir. Alan veya mülk, § 7.6.10.3'te belirtilen şartları karşılayan bir toplama tipinde olmalıdır.

Yani bu kodu:

Classroom tmp = new Classroom(); 
tmp.Students.Add("Jeff"); 
tmp.Students.Add("Kristin"); 
Classroom classroom = tmp; 

Temelde, bir nesne başlatıcısı içinde = tam bağımsız bir atama deyimi ile aynı değildir:

Classroom classroom = new Classroom { 
    Students = { "Jeff", "Kristin" } 
}; 

eşdeğerdir.

DÜZENLEME: yani Student için bir ayarlayıcı aramaya çalışırdım gibi bu kod

Classroom classroom = new Classroom { 
    Students = new List<string> { "Jeff", "Kristin" } 
}; 

, derlemek başarısız olur.

+1

Hızlı yanıt yanıtı düzeltmeleri düzenlemenin neresinde? – Michael

+0

Not: Öğrenciler = yeni Liste () 'bir yüz ifadesi verirken, bunun karşısında, başlangıçta bu diğer durumda beklenebilir? –

+1

Bu bilgi, "C# gününün gerçeğini düzenleme" kotamu yerine getirdi. – Chris