Как передать параметр конструктору статического класса?

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

public static class MyClass {

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

3 ответов


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

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

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

в C# статические конструкторы не имеют параметров, и существует несколько подходов для преодоления этого ограничения. Одно то, что я предложил вам выше.


согласно 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 метод.
  • если статический конструктор создает исключение, среда выполнения не будет вызывать его во второй раз, и тип останется неинициализированным для срок службы домена приложения, в котором находится ваша программа есть бегущий.

Если под "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);
    }
}

кроме того, можно использовать статические свойства только для чтения.