Warum ist es nicht zulässig, einen solchen Standardkonstruktor zu definieren?
Eine triviale Verwendung ist für rationale Zahlen:
Code: Select all
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;
}
}
PS: Helfen Standardparameter bei der Lösung dieses Problems für C# 4.0 oder wird der CLR-definierte Standardkonstruktor aufgerufen?
Jon Skeet antwortete:
Um Ihr Beispiel zu verwenden: Was würde passieren, wenn jemand Folgendes tun würde:
Code: Select all
Rational[] fractions = new Rational[1000];
Das sollte es auf jeden Fall , deshalb habe ich überhaupt den Standardkonstruktor geschrieben. Die CLR sollte den Konstruktor Standardnullung verwenden, wenn kein expliziter Standardkonstruktor definiert ist; Auf diese Weise zahlen Sie nur für das, was Sie nutzen. Wenn ich dann einen Container mit 1.000 nicht standardmäßigen Rationals möchte (und die 1.000 Konstruktionen wegoptimieren möchte), verwende ich eine List anstelle eines Arrays.
Dieser Grund ist meiner Meinung nach nicht stark genug, um die Definition eines Standardkonstruktors zu verhindern.