【发布时间】:2010-11-27 14:37:05
【问题描述】:
您好!我对 C# 编译器如何执行优化感到有些困惑。
我编写了以下 getter 来弥补“惰性”初始化,以及 null 情况下的默认值:
静态类助手:
private static string host;
public static string Host
{
get
{
return host ?? (host= (ConfigurationManager.AppSettings["Host"] ?? "host.ru"));
}
}
Reflector 反汇编的结果如下:
public static string Host
{
get
{
if (Helper.host == null)
{
string host = Helper.host;
}
return (Helper.host = ConfigurationManager.AppSettings["Host"] ?? "host.ru");
}
}
看起来它会以不同于假设的方式工作......
更新
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";
}
工作正常(来自配置,被覆盖),但 Reflector 显示相同:
public static string Host
{
get
{
if (Program.host == null)
{
string host = Program.host;
}
return (Program.host = GetVal() ?? "default");
}
}
【问题讨论】:
-
如果您使用 C# 4.0,我会考虑使用 Lazy
类进行延迟实例化。 -
对我来说看起来很奇怪。几乎看起来像是反射器或 C# 中的错误。但在如此简单的代码中出现 C# 错误听起来不太可能。
-
或许懂IL的人可以检查一下是不是reflector的bug
-
这样的代码在虚拟控制台应用程序中正常工作,提供假设的输出。看起来像 Reflector 中的一个错误... Console.WriteLine(Host);主机=“覆盖”; Console.WriteLine(Host);
-
您可以将其发布在反射器论坛中,以便他们确认是否是错误并修复它。
标签: c# compiler-construction reflector il