SORU
2 Aralık 2008, Salı


Neden't bir yapı için varsayılan bir kurucu tanımlamak .NET?

.NET bir değer türü (C# struct) parametreleri olmayan bir kurucu var. this post göre bu CLİ spec tarafından görevlendirilmiştir. Happes değer-her türü için varsayılan bir kurucu (derleyici?) tarafından oluşturulan nedir sıfır (null) tüm üyeleri başlatıldı.

Herkes gibi varsayılan bir kurucu tanımlamak için izin verilmeyen neden biliyor mu?

Önemsiz bir kullanımı rasyonel sayılar için

public struct Rational {
    private long numerator;
    private long denominator;

    public Rational(long num, long denom)
    { /* Todo: Find GCD etc. */ }

    public Rational(long num)
    {
        numerator = num;
        denominator = 1;
    }

    public Rational() // This is not allowed
    {
        numerator = 0;
        denominator = 1;
    }
}

Mevcut C# kullanarak bir varsayılan Rasyonel çok hoş değil 0/0.

S. S.Varsayılan parametreleri C bunu çözmek için yardım#4.0 veya CLR tanımlanan varsayılan yapıcı çağrılır?

< / ^ hr .

Düzenleme:Jon Skeet cevap verdi:

Sizin örnek kullanmak için, biri ne zaman başına ne yapsın ki:

 Rational[] fractions = new Rational[1000];

Yapıcı 1000 kat boyunca çalıştırmak gerekir?

Gerekir tabi, bu yüzden CLR kullanmak gerekir ilk etapta varsayılan kurucuyu yazdımvarsayılan sıfırlamakurucu açık varsayılan decimal tanımlandığında, bu şekilde sadece kullandığınız kadar ödersiniz. Daha sonra ise 1000 sigara varsayılan Rationals (1000 yapıların optimize çekilmek) bir kaba istersem List<Rational> bir yerine bir dizi kullanacağız.

Bu nedenle, aklımda, bir varsayılan kurucu tanımı engellemek için yeterince güçlü değildir.

CEVAP
2 Aralık 2008, Salı


Not:cevap aşağıda yazılmış uzun zaman önce C# 6, planlama tanıtmak yeteneğine ilan parametresiz kurucular yapılar - ama yine de olmaz denilen tüm durumlar (örneğin dizi oluşturma)(sonunda was not added to C# 6 özelliği).


EDİT: CLR içine Grauenwolf fikir nedeniyle aşağıda cevabı düzelttim.

CLR değer türleri parametresiz kurucular sağlar, ama C# değil. Bu yaramaz zaman yapıcı diye bir beklenti getirecek çünkü olduğuna inanıyorum. Örneğin, bu göz önünde bulundurun:

MyStruct[] foo = new MyStruct[1000];

CLR bu çok verimli bir şekilde yapmak mümkün sadece uygun bellek ayrılırken ve her şeyi sıfırlama. Eğer MyStruct yapıcı 1000 kez çalıştırmak olsaydı, bu çok daha verimli olurdu. (Aslında, hiç öyle değilyapınbir dizi oluşturduğunuzda çalıştırmak olmaz, veya başlatılmamış bir örnek değişkeni varsa parametresiz bir kurucu var.)

C temel kural "herhangi bir türü için varsayılan değer herhangi bir başlatma güvenemiyorum". Şimdi onlarolabilirparametresiz kurucular tanımlanması için izin vermiş, fakat daha sonra bu kurucu her durumda yürütülecek gerekli değil - ama bu daha fazla kafa karışıklığına yol açtı. (Ya da argüman gider bende öyle düşünüyorum en azından.)

EDİT: sizin örnek kullanmak İçin, biri ne zaman başına ne yapsın ki:

Rational[] fractions = new Rational[1000];

Yapıcı 1000 kat boyunca çalıştırmak gerekir?

  • Değilse, biz 1000 geçersiz rasyonel çözümlerin üzerine çıkıp
  • Eğer bunu yaparsa, o zaman gerçek değerleri ile bir dizi doldurmak üzereyiz eğer potansiyel İş Yükü kaybettik.

EDİT: (soruya biraz daha Cevap) parametresiz yapıcı derleyici tarafından oluşturulan değil. Değer türleri ortaya çıkıyor olsa da kurucular CLR ile ilgili olarak - gerek yokolabilirsen IL yazmak. Yazarken "new Guid()" C# eğer normal bir kurucu çağırırsanız ne almak için farklı IL yayar. O açıdan biraz daha fazla this SO question bkz.

Benşüpheliparametresiz kurucular ile çerçevesinde herhangi bir değer türü değil. Şüphesiz NDepend eğer güzelce yeteri kadar istedim ki... aslında C# beni muhtemelen kötü bir fikir olduğunu düşünmek için yeterince büyük bir ipucu yasaklar.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Gigawipf

    Gigawipf

    18 ŞUBAT 2010
  • Pituvision

    Pituvision

    11 Mart 2006
  • WhtButterflyLiz

    WhtButterfly

    14 NİSAN 2008