.Net Core 2.0和.Net 4.7.1在不同时间为同一代码初始化静态字段

时间:2018-09-05 15:10:43

标签: c# .net .net-core .net-core-2.0 .net-4.7.1

对于此程序:

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>在程序实际到达第一个引用之前就在程序开始时进行了初始化。为了确认这一点,我以调试模式逐步执行了该程序,确实如此。

造成这种差异的原因是什么?这是错误吗?

0 个答案:

没有答案