Desafio III - Membros Static
As seguintes classes geram o mesmo resultado? Se não, por quê?
public class A
{
public static string X = "A";
}
public class A
{
public static string X;
static A()
{
X = "A";
}
}
Teoricamente deveriam ser iguais, mas a segunda classe é equivalente à:
public class A
{
public static string X = "A";
static A()
{
}
}
A diferença está existência ou não do construtor. Quando não há construtor a classe é marcada como beforefieldinit, fazendo com que o type initializer seja chamado antes mesmo de qualquer referência à algum membro da classe.
Podemos perceber isso com o seguinte código:
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Iniciando");
A.Escrever("Escrever");
Console.WriteLine("Depois de escrever");
string y = A.X;
Console.WriteLine("Depois de acessar o campo X");
Console.ReadKey();
}
}
public class A
{
public static string X = Escrever("X (Type Initializer)");
public static string Escrever(string s)
{
Console.WriteLine(s);
return s;
}
}
Antes de qualquer coisa, o tipo já é inicializado. Mas se você criar um construtor, mesmo que vazio, a ordem das chamadas vai mudar.
O Type Initializer só é executado antes da primeira referência ao tipo. No caso antes do A.Escrever("Escrever").
Curioso, e pode gerar um comportamento inesperado.