对于此程序:
using System;
public static class Program
{
public static void Main()
{
Console.WriteLine("indexing a...");
var a = TypeIndexer<A>.TypeIndex;
Console.WriteLine($"global index = {IndexHolder.GlobalIndex}");
Console.WriteLine($"type index = {a}");
Console.WriteLine("");
Console.WriteLine("indexing b...");
var b = TypeIndexer<B>.TypeIndex;
Console.WriteLine($"global index = {IndexHolder.GlobalIndex}");
Console.WriteLine($"type index = {b}");
}
}
public class IndexHolder
{
private static int _gi;
public static int GlobalIndex
{
get
{
Console.WriteLine("! Global Index Get : " + _gi);
return _gi;
}
set
{
Console.WriteLine("! Global Index Set : " + value);
_gi = value;
}
}
}
public class TypeIndexer<T> : IndexHolder
{
public static int TypeIndex = GlobalIndex++;
}
class A {}
class B {}
定位.net 4.7.1时,我得到以下输出:
! Global Index Get : 0
! Global Index Set : 1
! Global Index Get : 1
! Global Index Set : 2
indexing a...
! Global Index Get : 2
global index = 2
type index = 0
indexing b...
! Global Index Get : 2
global index = 2
type index = 1
以.Net Core 2.0为目标时,此输出:
indexing a...
! Global Index Get : 0
! Global Index Set : 1
! Global Index Get : 1
global index = 1
type index = 0
indexing b...
! Global Index Get : 1
! Global Index Set : 2
! Global Index Get : 2
global index = 2
type index = 1
我希望他们俩都能给出.Net Core的输出。因为据我所知,静态字段在第一次被引用时会被延迟初始化。
看看.Net 4.7.1的输出,我发现TypeIndex
类中的静态字段TypeIndexer<T>
在程序实际到达第一个引用之前就在程序开始时进行了初始化。为了确认这一点,我以调试模式逐步执行了该程序,确实如此。
造成这种差异的原因是什么?这是错误吗?