Статические строки только для чтения - возможно столкнуться с многопоточными проблемами? - PullRequest
5 голосов
/ 16 июня 2011
public class MyClass<T>
{
    public static readonly String MyStringValue;

    static MyClass()
    {
        MyStringValue = GenerateString();
    }

    private static String GenerateString()
    {
        //Dynamically generated ONCE per type (hence, not const)
    }

    public void Foo()
    {
        Console.WriteLine(MyStringValue);
    }
}

Насколько я понимаю, статическая String только для чтения не будет сгенерирована, пока не будет вызван статический конструктор для класса.Но статический конструктор не будет вызываться до тех пор, пока не будет получен доступ к одному из статических методов или переменных.

В многопоточной среде возможно возникновение проблем из-за этого?По сути, статический конструктор по умолчанию одноэлементный заблокирован или я должен сделать это сам?То есть ... я должен сделать следующее:

private static Object MyLock;

static MyClass()
{
    lock(MyLock)
    {
        if (MyStringValue == null)
            MyStringValue = GenerateString();
    }
}

Ответы [ 2 ]

8 голосов
/ 16 июня 2011

Статический конструктор гарантированно запускается только один раз для каждого экземпляра. Так что вам не нужен ваш замок.

Обратите внимание, что он будет запускаться один раз для каждого общего параметра. Кроме того, статические поля универсального класса также не разделяются между различными универсальными параметрами.

1 голос
/ 17 июня 2011

Чтобы избежать этого, почему бы не сделать значение статическим свойством только с помощью метода доступа get, который вернул кэшированное значение, которое вы могли бы затем сделать приватным?Доступ к свойству get обеспечит запуск статического конструктора первым.

...