документация для объекта ошибки для службы Azure

Расширение наблюдений Fábio , следующая короткая и полная тестовая программа раскрывает JIT-чувствительные детали поведения TypeAttributes.BeforeFieldInit , сравнивая .NET 3.5 с последней версией (как в конце 2017 г.) .NET 4.7.1, а также демонстрирует потенциальную опасность для вариантов типа сборки внутри каждой самой версии. [1]

using System;
using System.Diagnostics;

class MyClass
{
    public static Object _field = Program.init();

    public static void TouchMe() { }
};

class Program
{
    static String methodcall, fieldinit;

    public static Object init() { return fieldinit = "fieldinit"; }

    static void Main(String[] args)
    {
        if (args.Length != 0)
        {
            methodcall = "TouchMe";
            MyClass.TouchMe();
        }
        Console.WriteLine("{0,18}  {1,7}  {2}", clrver(), methodcall, fieldinit);
    }
};

Ниже приведен вывод консоли о запуске этой программы во всех комбинациях из {x86, x64} и {Debug, Release}. Я вручную добавил символ треугольника Δ (не выпущенный программой), чтобы выделить различия между двумя версиями .NET.

.NET 2.0 / 3.5

2.0.50727.8825 x86 Debug 2.0.50727.8825 x86 Debug TouchMe fieldinit 2.0.50727.8825 x86 Release fieldinit 2.0.50727.8825 x86 Release TouchMe fieldinit 2.0.50727.8825 x64 Debug 2.0.50727.8825 x64 Debug TouchMe fieldinit 2.0.50727.8825 x64 Release 2.0.50727.8825 x64 Release TouchMe fieldinit

.NET 4.7.1

4.7.2556.0 x86 Debug 4.7.2556.0 x86 Debug TouchMe fieldinit 4.7.2556.0 x86 Release Δ 4.7.2556.0 x86 Release TouchMe Δ 4.7.2556.0 x64 Debug 4.7.2556.0 x64 Debug TouchMe fieldinit 4.7.2556.0 x64 Release 4.7.2556.0 x64 Release TouchMe Δ

Как отмечено во вступлении, возможно, более интересным, чем версия 2.0 / 3.5 или 4.7 deltas, являются отличия в текущей версии .NET, так как они показывают, что хотя поведение инициализации поля в настоящее время более согласовано между x86 и x64, чем это было раньше, все еще возможно испытать значительная разница в поведении инициализации поля выполнения между вашими Debug и Release сборками сегодня.

Семантика будет зависеть от того, произойдет ли вам вызов непересекающегося или, казалось бы, несвязанного статического метода в классе или нет, поэтому, если это приведет к ошибке для вашего общего дизайна, это, вероятно, будет довольно загадочным и трудным. o отследить.


Примечания1. В приведенной выше программе используется следующая функция утилиты для отображения текущей версии CLR:

static String clrver()
{
    var s = typeof(Uri).Assembly.Location;
    return FileVersionInfo.GetVersionInfo(s).ProductVersion.PadRight(14) +
        (IntPtr.Size == 4 ? " x86 " : " x64 ") +
#if DEBUG
        "Debug  ";
#else
        "Release";
#endif
}

1
задан Jay Gong 18 January 2019 в 06:42
поделиться