.NET'te, bir değer türü (C # struct) parametresiz bir yapıcıya sahip olamaz. Göre bu yazı bu CLI özellikleri tarafından şart koşulmaktadır. Her değer türü için, tüm üyeleri sıfır (veya null) olarak başlatan varsayılan bir kurucu (derleyici tarafından?) Oluşturulur .
Neden böyle bir varsayılan kurucu tanımlamaya izin verilmiyor?
Önemsiz bir kullanım rasyonel sayılar içindir:
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;
}
}
Geçerli C # sürümünü kullanarak, varsayılan Rational 0/0o kadar güzel değil.
Not : Varsayılan parametreler bunu C # 4.0 için çözmeye yardımcı olur mu veya CLR tanımlı varsayılan kurucu çağrılır mı?
Jon Skeet yanıtladı:
Örneğinizi kullanmak için, birisi yaptığında ne olmak istersiniz:
Rational[] fractions = new Rational[1000];Yapıcıdan 1000 kez geçmeli mi?
Elbette, bu yüzden varsayılan kurucuyu ilk başta yazdım. Herhangi bir açık varsayılan kurucu tanımlanmadığında CLR varsayılan sıfırlama yapıcısını kullanmalıdır ; bu şekilde yalnızca kullandığınız kadar ödersiniz. Sonra 1000 varsayılan olmayan Rationals bir kapsayıcı istiyorsanız (ve 1000 yapıları optimize etmek istiyorsanız) List<Rational>bir dizi yerine bir kullanacağım .
Bu nedenle, bence, varsayılan bir kurucu tanımını engelleyecek kadar güçlü değil.
Rational()parametresiz ctor yerine Rational(long num=0, long denom=1).
new Rational()eğer varsa böyle bir şey yok, ancak eğer, yapıcı çağıracağı new Rational()eşit olacaktır default(Rational). Her durumda, sözdizimini, yapınızın default(Rational)"sıfır değeri" ni (önerilen tasarımınızla birlikte "kötü" bir sayıdır Rational) istediğinizde kullanmanız önerilir . Bir değer türü için varsayılan değer Ther zaman değerdir default(T). Bu yüzden new Rational[1000]asla yapı kurucularını çağırmayacaksınız.
denominator - 1, yapı içinde saklayabilirsiniz , böylece varsayılan değer 0/1 olur
Then if I want a container of 1000 non-default Rationals (and want to optimize away the 1000 constructions) I will use a List<Rational> rather than an array.Neden bir dizinin bir yapı için Listeye farklı bir kurucu çağırmasını beklersiniz?