.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/0
o 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 Rational
s 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 T
her 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?