SORU
7 EYLÜL 2010, Salı


Neden# 3.0 nesne C başlatıcı yapıcı parantezler isteğe bağlıdır?

C# 3.0 nesne başlatıcı sözdizimi bir parametresiz bir kurucu mevcut olduğunda kurucu parantez aç/kapat çifti dışlamak gibi görünüyor. Örnek:

var x = new XTypeName { PropA = value, PropB = value };

Olarak karşı çıkan:

var x = new XTypeName() { PropA = value, PropB = value };

Kurucu/yakın çift XTypeName buradan sonra isteğe bağlı açık neden merak ediyorum?

CEVAP
7 EYLÜL 2010, Salı


GÜNCELLEME: This question was the subject of my blog on September 20th 2010. Harika soru için teşekkür ederiz!

Josh sez:

Sayın Bay, içimizde bir şey söyle :) Lippert

Öncelikle, "insanlar: eğer benim dikkatimi istediğiniz bir şey varsa her zaman açık" "linki bloguma. temas tıklayabilirsiniz yarasa sinyali tüm

İkincisi, ahbap, "" benim . Bay Lippert ^em>baba.

Josh ve Chad yanıtlar ("hiç bir değeri neden şart? yani Ekle" ve "fazlalık ortadan kaldırmak için") temelde doğru. Bu biraz daha fazla et için:

Sen bir parçası olarak bağımsız değişken listesi elide izin verme özelliği "büyük özellik, nesne başlatıcılar için bizim barda bir araya geldi", "şekerli" vardır. Biraz düşündük puan:

  • tasarım ve şartname maliyeti düşük oldu
  • yoğun zaten nesne oluşturma işleyen çözümleyici kodu değiştirme olacaktık; parametre listesi opsiyonel yapma ek geliştirme maliyeti büyük özelliği maliyetine kıyasla çok geniş değildi
  • test yükü büyük özelliği maliyetine kıyasla nispeten küçüktü
  • Dokümantasyon yükü nispeten küçük göre
  • bakım yükü küçük olması beklenen; birlikte gelen bu yana herhangi bir hata yıllarda bu özelliği bildirdi hatırlamıyorum.
  • özelliği bu alanda gelecek özellikler için hemen ortada herhangi bir risk oluşturmaz. (Yapmak istediğimiz en son şey çok daha zor gelecekte daha ilgi çekici bir özelliği uygulamak için yapar daha kolay bir özellik şimdi yapın.)
  • bu özellik, dilin sözcüksel, dilbilgisel ya da anlamsal analizi için yeni belirsizlikler ekliyor. "Program" IDE tarafından gerçekleştirilen analizi "girerken." IntelliSense motoru bu kısmi sıralama için herhangi bir sorun teşkil Ve benzeri.
  • özelliği, bir ortak, genellikle, nesnenin kurucu yok çünkü . bu kesin başlatıcı bir nesne kullanıyorsanız, "büyük nesne başlatma özelliği; spot" tatlı vurur ^em>değilsiz istediğiniz özellikleri ayarlamak için izin ver. Bu tür nesneler sadece "ilk etapta. decimal hiçbir parametreleri" özelliği çantaları olduğu için çok yaygındır

GÜNCELLEME: James yorum: sorar

Neden o zaman da boş parantez isteğe bağlı mı bu nesne oluşturma ifadesi varsayılan oluşturucu çağrısı yaptınızdeğilbir nesne başlatıcı var?

Yukarıdaki kriterleri o listeye bir daha bak. Bunlardan biri değişim programı sözcüksel, dilbilgisel ya da anlamsal analiz yeni bir belirsizlik sunar. Önerilen değişiklikyoksemantik analiz bir belirsizlik tanıtmak:

class P
{
    class B
    {
        public class M { }
    }
    class C : B
    {
        new public void M(){}
    }
    static void Main()
    {
        new C().M(); // 1
        new C.M();   // 2
    }
}

1 satır yeni bir C oluşturur, varsayılan yapıcıyı çağırır ve sonra yeni bir nesne örneğini yöntemi M çağırır. Hat 2 B. M yeni bir örneğini oluşturur ve varsayılan kurucusunu çağırır.Eğer 1 numaralı satırda parantez içinde isteğe bağlı olsaydı o zaman hat 2 belirsiz olurdu.O zaman bir kural belirsizlik çözme ile gelip olurdu, yapamadıkhatao zaman mevcut yasal bir C değiştiren bir son dakika değişikliği olabilir çünkü# kırık bir programa program.

Parantez sadece belirsizlikler tanıtmak olmadığı durumlarda isteğe bağlıdır aslında. kural çok karmaşık olması gerekir bu yüzden: Belirsizlikler tanıtmak ve onları tespit derleyici kod yazma tüm olası olayları analiz etmemiz gerekir.

Bu ışık, bir geri gidip bahsettiğim tüm masrafları bak. Kaç tanesi büyük olmak? Karmaşık kurallar büyük tasarım, spec, geliştirme, Test ve Dokümantasyon maliyetleri var. Karmaşık kurallar çok daha ileride özelliklere sahip beklenmedik etkileşimleri ile ilgili sorunlar neden olabilir.

Hepsi ne için? Dil için yeni bir temsili güç katar, ama deli köşe ekleme küçük bir müşteri yararı durumlarda sadece bağırmak için bekleyen "yakaladım" ... içine çalışan zavallı masum bir ruh. Bu gibi özellikleri kestirhemenve yerine "asla" listesi.

James biraz daha takip sorular sorar, yazanın özgürlükler ile alıyorum ki: GÜNCELLEME:

Nasıl belirli bir belirsizlik anladınız?

Hemen belli oldu; C kuralları oldukça aşina olduğum# noktalı bir isim beklendiği belirlemek için.

Ne zaman yeni bir özellik dikkate alınarak, nasıl bir belirsizlik bu, neden olup olmadığını belirlemek için? Makine analizi ile resmi kanıt tarafından elle,,, ne?

Tüm üç. Çoğunlukla biz sadece yukarıda yaptığım gibi spec ve erişte bak. Örneğin, C için yeni bir önek operatör eklemek istedim sanırım biz#"": . frob

x = frob 123   456;
< . p ^"" gibi "" veya "" - bazı tür bir ifade önce gelir. yeni frob Olurduk çalışmak istenen öncelik ve birleşim ve benzeri, ve sonra başlamak sorular sormak gibi "ne varsa program zaten bir tür, alan, özellik, olay, yöntem, sabit veya yerel olarak adlandırılan frob?" Bu gibi durumlarda hemen yol açacak:

frob x = 10;

"x = 10, veya türü frob x adında bir değişken oluştur sonucuna frob işlemi yapmak ve atamak 10?" demek

G(frob   x)

Demek ki, "frob tekli artı operatörünün sonucu x" ya da "ifade frob Ekle x"? için

Ve benzeri. Bu belirsizlikleri gidermek için keşif tanıtmak olabilir. Derken "var x = 10;" muğlak; anlamına gelebilir "x türü" ya da anlamına gelebilir "x türü var." sonucuna Bir şekilde cevabı var: biz ilk bir tür, ve eğer biri varsa, Sadece x türü anlaması mı var. adında aramak için girişimi

Ya da ne olduğu belirsiz değildir, sözdizimini değiştirmek isteyebiliriz. C# 2.0 tasarladıkları zaman bu sorun vardı:

yield(x);

"Verimi" x "yineleyici" veya "değişken faiz yöntemi x diyorsun?" anlamına mı geliyor Bunun için değiştirerek

yield return(x);

şimdi kesin.

Bir nesne başlatıcı isteğe bağlı parens durumunda basit belirsizlikler tanıttı ya da değil, çünkü var olup olmadığı hakkında ortada hiçbir neden yokhangi ile başlayan bir şey takdim etmek caizdir durumlar sayısı { çok küçük. Çeşitli bağlamlarda ifade, deyim Lambda, dizi başlatıcılar ve temelde sadece. Kolay tüm davalar akıl ve belirsizlik var olduğunu göstermek için. IDE verimli olmasını sağlamak biraz daha zor ama çok fazla sorun olmadan yapılabilir.

Etrafında spec ile işe yaramaz bu tür genellikle yeterli olur. Eğer özellikle zor bir özellik, daha sonra ise dışarı ağır araçları çekeceğiz. Örneğin, tasarımı SERİ, daha iyi bir derleyici çocuklar ve bir IDE erkek hem de bir planda çözümleyici bir teori inşa kendilerini bir parser generator verebilecek analiz gramer arıyorum belirsizlikler ve ardından fed önerilen C# gramerleri için sorgu kapsam içine; bunu yaparken buldum çoğu yerde sorguları edildi, belirsiz.

Ya da, ne zaman yaptık gelişmiş tür kesmesi Lambda C# 3.0 yazdık Yukarı önerilerimiz ve sonra gönderdi onların üzerine gölet için Microsoft Research Cambridge nerede diller takım vardı yeterince iyi ise sonunda resmi bir kanıt bu tür kesmesi öneri olduğunu teorik olarak sağlam.

C belirsizlikler var# bugün?

Emin.

G(F<A, B>(0))

C# 1 Ne demek açıktır. Aynı işte

G( (F<A), (B>0) )

Yani, bools iki bağımsız değişken G çağırır. C# 2, yani ne demek C# 1, ama olabilir de yani "pass 0 genel yöntem F alır bu tür parametreleri A ve B, ve sonra geçmesi sonucu F, G". Muhtemelen anlamına geliyordu belirleyen çözümleyici için karmaşık bir sezgisel ekledik.

Benzer şekilde, atmalarını bile C# 1.0 belirsiz

G((T)-x)

"Cast-x T" veya "T x çıkarmak" mı? Yine, iyi bir tahmin yapan bir sezgisel.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Nickcidious

    Nickcidious

    6 HAZİRAN 2011
  • sebsebdouze

    sebsebdouze

    7 ŞUBAT 2008
  • The Bad Tutorials

    The Bad Tuto

    6 EKİM 2009