2010-01-07 19 views
29

C 3. başlatıcı sözdizimi gibi ve bir çok kullanmaya, ama bugün yansıtıcı içinde bakarken, şu geldi: İlk baştaInitializer sözdizimi

var binding = new WSHttpBinding 
{ 
    ReaderQuotas = { MaxArrayLength = 100000 }, 
    MaxReceivedMessageSize = 10485760 
}; 

Bunun bir hata olduğunu düşündüm ama derliyor ! Sanırım her zaman yeni şeyler öğreniyorum.

Anlatabildiğim kadarıyla, WSHttpBinding ürününün ReaderQuotas özelliğinin MaxArrayLength özelliğini ayarlar.

Bu sözdizimi yeni bir ReaderQuotas nesnesi oluşturuyor ve sonra bu özelliği ayarlıyor mu, yoksa özellik zaten başlatılmış mı? Bu, 'çocuk' özelliklerini başlatmak için kullanacağı genel yol mu? Ben sözdizimini bir kafa karıştırıcı biraz bulurum

...

+0

[Bu gönderi] 'ye ilgi duyabilirsiniz (http: //www.codeducky.Bu tür başlatıcı için semantiği ve kullanım durumlarını ele alan org/çift-öznitelik-c-nesnesi-başlatıcıları /) – ChaseMedallion

cevap

22

Hayır, = new SomeType {...} kullanmadığınız sürece yeni nesneler yaratmak etmediğini:

var binding = new WSHttpBinding 
{ 
    ReaderQuotas = new XmlDictionaryReaderQuotas { MaxArrayLength = 100000 }, 
    MaxReceivedMessageSize = 10485760 
}; 

Sizin örnek özelliklerini ayarlamak için başlatıcı sözdizimi gösterir mevcut alt nesneler. Koleksiyonlarda "Ekle" yöntemlerini çağırmak için de benzer bir sözdizimi vardır.

var binding = new WSHttpBinding(); 
binding.ReaderQuotas.MaxArrayLength = 100000; 
binding.MaxReceivedMessageSize = 10485760; 
+0

Bununla aynı görünüyor, sözdizimsel bir farktan daha fazlası var mı? Görünüşe bakılırsa (WSHttpBinding'in çalışmasında ReaderQuotas başlatılmamışsa) bir istisna atar – James

+0

Teşekkürler, sadece beni şaşırtmıştı :) Bir toplama başlatıcısı gibi demek istediğin 'Ekle' ile farz ediyorum. – leppie

+0

@james: Bu durumda bir istisna beklerdim, ancak yapıcıda ne yapılacağını bilmiyorsanız, kaynak kodunun kafa karıştırıcı olmadığını kanıtlayabilir. Bazı kurucu aşırı yüklenmeler bu özelliği başlatabilir veya başlatmayabilir, bu da daha fazla karışıklığa yol açacaktır. – leppie

14

Biraz kafa karıştırıcı, kabul ediyorum:

Kodunuz geniş karşılaştırılabilirolduğunu.

Belirtilen bölüm 7.6.10.2 bölümlerini okumalısınız; Burada açıklanmıştır. Örneğin:

eşittir alan veya özelliğin bir atama aynı şekilde işlenir oturum açtıktan sonra bir ifade belirten bir üyesi başlatıcısı.

eşittir sonra işareti bir nesne başlatıcı belirten bir üye başlatıcı yani gömülü nesnenin bir başlatma iç içe geçmiş bir nesne başlatıcısı, olup. Alana veya özelliğe yeni bir değeri atamak yerine, yuvalanmış nesneye başlatıcıdaki atamaları, alanın veya özelliğin üyelerine atamaları olarak kabul edilir. İç içe başlatılan nesne başlatıcıları, türünde bir değere veya değer türüne sahip salt okunur alanlara uygulanan olamaz.

işareti bir gömülü koleksiyonun bir başlatma olduğu eşittir sonra toplama başlatıcı belirten bir üyesi başlatıcısı. yerine alanına veya özelliğine yeni bir koleksiyon atama, başlatıcıda verilen öğeler alan veya özelliği tarafından başvurulan koleksiyonuna eklenir.