Ваша вторая версия предпочтительнее.Вы можете заблокировать его немного больше, сделав свое поле readonly
:
public static class MyStaticClass
{
private static readonly MyClass _myClass = new MyClass();
public static string GetValue(int key)
{
return _myClass.GetValue(key);
}
}
Похоже, ваше намерение состоит в том, что _myClass
изначально имеет значение MyClass
и никогда не устанавливается другим,readonly
выполняет это, указывая, что его можно установить только один раз, либо в статическом конструкторе, либо инициализируя его, как указано выше.Мало того, что другой поток не может установить его, но любая попытка изменить его приведет к ошибке компилятора.
Вы можете опустить readonly
и просто никогда не установить _myClass
снова, но readonly
и связывает, иусиливает ваше намерение.
Вот где это становится сложнее: Ваша ссылка на экземпляр MyClass
является поточно-ориентированной.Вам не нужно беспокоиться о том, будут ли различные потоки заменять его другим экземпляром (или устанавливать его на ноль), и он будет создан до того, как какой-либо поток попытается с ним взаимодействовать.
Что это делает не сделать это сделать MyClass
потокобезопасным.Не зная, что он делает или как вы взаимодействуете с ним, я не могу сказать, что это за потребности или проблемы.
Если это проблема, один из подходов состоит в использовании lock
для предотвращения одновременногодоступ, который не должен происходить, именно так, как продемонстрировал @ Mahi1722.Я включил код из этого ответа (не для плагиата, но если что-то случится с этим ответом, то этот будет ссылаться на ответ, который не существует.)
public static class MyStaticClass
{
private static MyClass _myClass = new MyClass();
private static object _lockObj = new object();
public static string GetValue(int key)
{
return _myClass.GetValue(key);
}
public static void SetValue(int key)
{
lock(_lockObj)
{
_myClass.SetValue(key);
}
}
}
Оба метода, которые взаимодействуют с_myClass
блокировка с использованием _lockObject
, что означает, что любое выполнение любого из них будет блокироваться, пока выполняется другой поток.
Это правильный подход.Другой способ - сделать поток MyClass
потокобезопасным, либо используя параллельные коллекции, либо реализуя такие блокировки в этом классе.Таким образом, вам не нужно использовать операторы lock
в каждом классе, который использует экземпляр MyClass
.Вы можете просто использовать его, зная, что он управляет этим внутри.