No .NET, um tipo de valor (C # struct
) não pode ter um construtor sem parâmetros. De acordo com este post, isso é obrigatório pela especificação da CLI. O que acontece é que, para cada tipo de valor, é criado um construtor padrão (pelo compilador?) Que inicializa todos os membros como zero (ou null
).
Por que não é permitido definir um construtor padrão?
Um uso trivial é para números racionais:
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;
}
}
Usando a versão atual do C #, um Rational padrão é o 0/0
que não é tão legal.
PS : Os parâmetros padrão ajudarão a resolver isso no C # 4.0 ou o construtor padrão definido pelo CLR será chamado?
Jon Skeet respondeu:
Para usar seu exemplo, o que você gostaria que acontecesse quando alguém fizesse:
Rational[] fractions = new Rational[1000];
Ele deve executar seu construtor 1000 vezes?
Claro que deveria, foi por isso que escrevi o construtor padrão em primeiro lugar. O CLR deve usar o construtor de zeragem padrão quando nenhum construtor padrão explícito é definido; Dessa forma, você paga apenas pelo que usa. Então, se eu quiser um contêiner de 1000 Rational
s não padrão (e quiser otimizar as 1000 construções), usarei List<Rational>
uma matriz em vez de uma matriz.
Este motivo, em minha opinião, não é forte o suficiente para impedir a definição de um construtor padrão.
Rational()
chama o ctor sem parâmetros em vez de Rational(long num=0, long denom=1)
.
new Rational()
chamará o construtor se ele existir, no entanto, se não existir, new Rational()
será equivalente a default(Rational)
. De qualquer forma, é recomendável usar a sintaxe default(Rational)
quando desejar o "valor zero" da sua estrutura (que é um número "ruim" com o design proposto Rational
). O valor padrão para um tipo de valor T
é sempre default(T)
. Portanto new Rational[1000]
, nunca invocará struct constructors.
denominator - 1
no interior da estrutura, de modo que o valor padrão se torna 0/1
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.
Por que você esperaria que uma matriz chamasse um construtor diferente para uma lista para uma estrutura?