.NET: Статические конструкторы вызываются, когда константа является доступом?

StackOverflow https://stackoverflow.com/questions/6316738

  •  26-10-2019
  •  | 
  •  

Вопрос

Итак, вот что я думаю ...

public class MyClass
{
    public const string MyConstant = "MyConstantValue";

    private static MyClass DefaultInstance;

    static MyClass()
    {
         DefaultInstance = new MyClass();
    }
}

...

NotificationService.RegisterForNotification(MyClass.MyConstant, Callback);

Это сработает или мне нужно использовать что -то вроде static readonly имущество поле для запуска статического конструктора?

Это было полезно?

Решение

Использование константы не обязательно приводит к доступу члена, что приведет к тому, что статический конструктор будет вызван. Компилятору разрешено (поощрять, даже) заменить значение постоянной во время компиляции.

Ваше предложенное обходной путь static readonly должно быть в порядке, хотя readonly предлагает поле, а не собственность. Свойства только для чтения, когда у них нет сеттера, readonly Ключевое слово не задействовано.

Простой пример:

class HasSConstructor
{
    internal const int Answer = 42;
    static HasSConstructor()
    {
        System.Console.WriteLine("static constructor running");
    }
}

public class Program
{
    public static void Main()
    {
        System.Console.WriteLine("The answer is " + HasSConstructor.Answer.ToString());
    }
}

Вывод под .NET 4.0:

Ответ 42

Статический конструктор никогда не работает!

Другие советы

Статический конструктор называется автоматически до создания первого экземпляра или упоминаются любые статические члены. Глянь сюда: MSDN: статические конструкторы

Кстати, постоянные поля по своей природе статичны, но, как указано, они могут (и, вероятно, будут заменены самим значением.

Статический конструктор не будет вызван, если вы просто получаете доступ к общественным константам. Например, рассмотрим этот класс:

class Testo
{
    public const string MyValue = "Hello, world";
    public static readonly int xyzzy;

    static Testo()
    {
        Console.WriteLine("In static constructor");
        xyzzy = 27;
    }
}

Теперь в другом классе выполните:

Console.WriteLine(Testo.MyValue);
Console.WriteLine(Testo.xyzzy);

Ваш вывод будет:

Hello, world
In static constructor
27

Константы поднимаются из класса во время компиляции. Так что ценность Testo.MyValue не ссылается на Testo класс во время выполнения. Статический конструктор не вызывается, пока вы не назовуте что -то, что требует инициализации.

Итак, да, вам нужно получить доступ к чем -то вроде static readonly Если вы хотите убедиться, что конструктор вызван.

Нет, тебе не нужно такого. Статический конструктор вызывается, когда класс загружается.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top