Dans .NET une valeur de type (C# struct
) ne peut pas avoir un constructeur sans paramètres. Selon ce post, c'est mandaté par la CLI spec. Ce happes est que pour chaque type de valeur d'un constructeur par défaut est créé (par le compilateur?) qui initialisé tous les membres à zéro (ou null
).
Personne ne sait pourquoi il n'est pas autorisé à définir un constructeur par défaut?
Un trivial utilisation est pour les nombres rationnels
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;
}
}
L'aide de C# par défaut Rationnelle est - 0/0
qui n'est pas si cool.
P. S. par défaut des paramètres de l'aider à résoudre ce pour C#4.0, ou le CLR défini dans le constructeur par défaut être appelé?
Edit: Jon Skeet répondu:
Pour utiliser votre exemple, que voudriez-vous arriver si quelqu'un a fait:
Rational[] fractions = new Rational[1000];
Faut-il courir à travers votre constructeur 1000 fois?
Assurez-vous qu'il le devrait, c'est pourquoi j'ai écrit le constructeur par défaut en premier lieu, le CLR doit utiliser la valeur par défaut réinitialisation de constructeur lorsque aucun par défaut explicite ctor est défini, de cette façon, vous ne payez que pour ce que vous utilisez. Ensuite, si je veux un conteneur de 1000 par défaut Rational
s (et vous voulez optimiser loin les 1000 constructions), je vais utiliser un List<Rational>
plutôt qu'un tableau.
C'est pourquoi, dans mon esprit, n'est pas suffisamment forte pour empêcher la définition d'un constructeur par défaut.