Как передать параметр конструктору статического класса?
У меня есть статический класс со статическим конструктором. Мне нужно как-то передать параметр этому статическому классу, но я не уверен, как лучше всего. Что бы вы порекомендовали?
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);
}
}
кроме того, можно использовать статические свойства только для чтения.