我尝试了解 beforefieldinit 标志。 我写了两个简单的类
class Foo
{
public static object o;
static Foo()
{
o = new object();
}
}
class Bar
{
public static object o = new object();
}
然后在Main中我使用了两个类,并在调用任何代码之前为Main方法的第一个行设置了一个断点。 在Watch窗口中,我检查并看到了
这有点奇怪,因为我认为标志的目的是懒惰 - 不想在实际需要之前初始化对象。 这也是关于here
的此行为的原因是什么,是否会影响性能?
然后我想检查性能,所以我在Main中编写了以下代码:
Stopwatch sw = new Stopwatch();
sw.Start();
for (int i = 0; i < 2000000000; i++)
{
object foosObject = Foo.o;
if (foosObject == null)
{
Console.WriteLine("");
}
}
sw.Stop();
Console.WriteLine("With Static Ctor: " + sw.Elapsed);
sw.Reset();
sw.Start();
for (int i = 0; i < 2000000000; i++)
{
object barsObject = Bar.o;
if (barsObject == null)
{
Console.WriteLine("");
}
}
sw.Stop();
Console.WriteLine("Without Static Ctor: " + sw.Elapsed);
sw.Reset();
输出
使用Static Ctor:00:00:06.0167153
没有静态Ctor:00:00:04.2441007
因此,性能差异 50%。为什么第一个循环运行得慢?我用ILDASM查看了IL,我没有看到任何差异