Подтвердить что ты не робот

Как передать параметр в static class constructor?

У меня есть статический класс со статическим конструктором. Мне нужно каким-то образом передать параметр этому статическому классу, но я не уверен, как наилучшим образом. Что бы вы порекомендовали?

public static class MyClass {

    static MyClass() {
        DoStuff("HardCodedParameter")
    }
}
4b9b3361

Ответ 1

Не используйте статический конструктор, но статический метод инициализации:

public class A
{
    private static string ParamA { get; set; }

    public static void Init(string paramA)
    {
        ParamA = paramA;
    }
}

В С# статические конструкторы без параметров, и для преодоления этого ограничения существует несколько подходов. Это то, что я предложил вам выше.

Ответ 2

В соответствии с MSDN Статический конструктор вызывается автоматически для инициализации класса до создания первого экземпляра. Поэтому вы не можете отправить ему какие-либо параметры.

CLR должен вызвать статический конструктор, как он узнает, какие параметры передать его?

Поэтому не используйте статический конструктор.

Здесь работа для вашего требования.

public class StaticClass 
{ 
  private int bar; 
  private static StaticClass _foo;

  private StaticClass() {}

  static StaticClass Create(int initialBar) 
  { 
    _foo = new StaticClass();
    _foo.bar = initialBar; 
    return _foo;
  } 
}

Статические конструкторы обладают следующими свойствами:

  • Статический конструктор не принимает модификаторы доступа или не имеет параметров. Статический конструктор автоматически вызывается инициализировать класс до создания первого экземпляра или любого статические члены ссылаются.
  • Статический конструктор нельзя вызвать напрямую.
  • Пользователь не может контролировать, когда статический конструктор выполняется в программе.
  • Типичное использование статических конструкторов - это когда класс использует файл журнала, а конструктор используется для записи записей в этот файл.
  • Статические конструкторы также полезны при создании классов-оболочек для неуправляемого кода, когда конструктор может вызвать LoadLibrary Метод.
  • Если статический конструктор генерирует исключение, среда выполнения не будет вызывать его второй раз, и тип останется неинициализированным для время жизни домена приложения, в котором ваша программа работает.

Ответ 3

Если по "HardCodedParameter" вы действительно имеете в виду жесткое кодирование, вы можете использовать константы.

public static class YoursClass
{ 
    public const string AnotherHardCodedParam = "Foo";
}

public static class MyClass
{
    private const string HardCodedParam = "FooBar";

    static MyClass()
    {
        DoStuff(MyClass.HardCodedParam);
        DoStuff(YoursClass.AnotherHardCodedParam);
    }
}

Кроме того, вы можете использовать статические свойства readonly.