Salutations! Je suis un peu confus sur la façon dont le compilateur C# effectue ses optimisations.
j'ai écrit le getter suivant pour compenser l'initialisation « paresseux », et la valeur par défaut en cas de null:Optimisations de compilation C#: opérateur de coalescence nulle - MISE À JOUR - Bogue du réflecteur?
Classe statique Helper:
private static string host;
public static string Host
{
get
{
return host ?? (host= (ConfigurationManager.AppSettings["Host"] ?? "host.ru"));
}
}
Voici le résultat de désassemblage par réflecteur :
public static string Host
{
get
{
if (Helper.host == null)
{
string host = Helper.host;
}
return (Helper.host = ConfigurationManager.AppSettings["Host"] ?? "host.ru");
}
}
on dirait qu'il travaillerait d'une autre manière que prévu ...
MISE À JOUR
private static string host;
public static string Host
{
get
{
return host ?? (host = (GetVal() ?? "default"));
}
}
static void Main(string[] args)
{
Console.WriteLine(Host);
host = "overwritten";
Console.WriteLine(Host);
}
static string GetVal()
{
return "From config";
}
fonctionne correctement (De config, écrasé), mais réflecteur montre la même:
public static string Host
{
get
{
if (Program.host == null)
{
string host = Program.host;
}
return (Program.host = GetVal() ?? "default");
}
}
Si vous utilisez C# 4.0 Je regarde en utilisant la classe Lazy pour Lazy instanciation. –
Cela me semble assez étrange. Presque ressemble à un bug dans le réflecteur ou C#. Mais un bug C# dans un code aussi simple semble plutôt improbable. – CodesInChaos
Peut-être que quelqu'un qui comprend IL peut vérifier si c'est un bug dans le réflecteur – CodesInChaos