Em um post anterior examinamos o uso de parâmetros com valores default em construtores de structs; desta vez, vamos dar uma olhada rápida no que acontece quando temos parâmetros do tipo struct com valores default. Então, sem mais delongas, vamos começar com a seguinte struct1:
struct S
{
public int v = 42;
public S(string s) { v = 13; }
}
e o seguinte uso:
M();
void M(S s = new S()) => Console.WriteLine(s.v);
Qual saída você espera obter?
Se você tem acompanhado esta série de posts provavelmente notou que esta é uma pergunta capciosa e que nem 42 nem 13 são respostas corretas uma vez que para que tais valores pudessem ser impressos isso exigiria que o inicializador de campo e/ou o construtor fossem executados, mas a expressão new S()
usada como valor default em parâmetros
não implica uma invocação de construtor (afinal, não há um construtor sem parâmetros e, caso você esteja tentado a adicionar um, o compilador emitirá um erro, pois, na presença de tal construtor, a expressão em questão não representa mais uma constante de tempo de compilação, portanto, não pode ser usada como um valor default).
Na realidade, quando executado o trecho de código exibirá 0
pois o compilador simplesmente inicializa a memória usada para armazenar a instância da struct com zeros (0
). Por outro lado, se você invocar o método M()
como a seguir2:
M(new S("Foo"));
o compilador emitirá código para executar o construtor e o inicializador de campo e 13
será impresso, mas isso não tem mais nada a ver com o valor de parâmetro padrão
.
E com isso exploramos o último comportamento não tão intuitivo
de estruturas que pretendíamos abordar; o próximo post será a conclusão desta série.
Como sempre, todos os comentários são bem-vindos.
Divirta-se!