{} içinde nesne parametreleri oluşturuluyor mu?


15

Bir kitaptan kod parçasını deşifre etmeye çalışıyorum:

List<Person> people = new List<Person>()
{
new Person {FirstName="Homer",LastName="Simpson",Age=47},
new Person {FirstName="Marge",LastName="Simpson",Age=45}
};

Kişi sadece bir grup alanı olan basit bir sınıftır: İsim, Soyadı, vb ...

Anlamadığım şey, kıvırcık olmayan parantez içindeki bir Kişinin yapıcısına parametre göndermiyor muyuz? Bu kodu çoğaltmayı denedim, ama uçmak gibi görünmüyor, herhangi bir alıcı?

Giriş için teşekkürler.



1
"Bu kodu çoğaltmayı denedim, ama uçmuyor gibi görünüyor" <- Bu sözdiziminin kullanılabilir olması için C # 3 (VS 2008) veya daha yenisini kullanmanız gerekir.
AakashM

İki kavram arasındaki farkların farkında olun: Nesne Başlatma ve Nesne Nüfusu. Genel olarak yapıcıda başlatma işlemi yaparsınız. Örneğinizin yöntemi en iyi şekilde başlatma için değil popülasyon için kullanılır.
NoChance

Yanıtlar:


27

C #, nesne başlatıldığında kıvırcık parantez içindeki özellik parametrelerini belirtmenizi sağlar. Bu, hangi öğelerin başlatılacağını ve hangilerinin varsayılan olarak bırakılacağını seçmenize ve seçmenize olanak tanır.

Öte yandan bir kurucu, tek bir kod bloğunu sabit bir parametre kümesiyle çalıştırır. Aynı efekti elde etmek için, başlatmak isteyebileceğiniz çeşitli özellik kombinasyonlarına sahip birden fazla kurucu oluşturmanız gerekir, bu da sıkıcı olabilir.

var x = new Person {FirstName="Homer",LastName="Simpson",Age=47}; 

tam olarak buna eşittir:

var x = new Person();
x.FirstName="Homer";
x.LastName="Simpson";
x.Age=47;

Bunun dışında gözler üzerinde daha kısa ve tartışmasız daha kolay.

Ayrıca, sorunuzda gösterdiğiniz gibi, geçici değişkenler oluşturmanız ve bunları listeye eklemeden önce burada yaptığım gibi başlatmanız gerekiyorsa çok sıkıcı olacak yapılara izin verir. (Bunu yapmak için kullandığınız şey budur.) Tümü, istediğiniz veya bulunamayan istediğiniz parametre listesini alan, açıkça tanımlanmış bir kurucuya ihtiyaç duymadan.

Ayrıca, bir kurucu özellikleri özel bir ayarlayıcı ile başlatabilirken, bu tekniğin (verilen örnekten de anlaşılacağı gibi) yalnızca mülk için bir ortak ayarlayıcı varsa çalışacağını unutmayın. Ayrıca kısaltılmış örneğimin örtük olarak varsayılan (parametresiz) yapıcı olarak adlandırıldığını ve bu nedenle mevcut olması gerektiğini unutmayın.


Bu nedenle, kıvırcık parantezlerde başlatılan özelliklerin herkese açık olarak ayarlanması gerektiğini eklemeye değer olabilir.
Yam Marcovic

@YamMarcovic ah. Evet. Bu etkiye not eklendi.
tylerl

2
Ah, ben aydınlandım, mükemmel bir açıklama.
RealityDysfunction

2
Tek bir kurucu ile çok benzer bir etki elde etmek için, tüm parametrelerini isteğe bağlı yapabilirsiniz. Sonra ve parametrelerini new Person(lastName: "Simpson")dışarıda bırakarak böyle bir şey yapabilirsiniz . firstNameage
svick

Bu, neden sadece var x = new Person("Homer", "Simpson", 47);
kurucuya geçemediğinizi ele almıyor
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.