如何将参数传递给静态类构造函数

本文关键字:静态类 构造函数 参数传递 | 更新日期: 2023-09-27 18:26:27

我有一个带有静态构造函数的静态类。我需要以某种方式将一个参数传递给这个静态类,但我不确定最佳方式是什么。你推荐什么?

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

如何将参数传递给静态类构造函数

不要使用静态构造函数,而是使用静态初始化方法:

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);
    }
}

此外,您还可以使用静态只读属性。

非静态类上的构造函数可以确保它们在实际使用之前得到正确初始化。

由于静态类没有这个好处,您必须自己确保。

使用一个具有明显名称的静态构造函数,然后在静态过程的相关部分进行检查,以确保已执行初始化。下面的例子假设你想";初始化";带有Form对象的静态类。

    public static class MyClass
    {
        private static Form FormMain { get; set; }
        public static void Init(Form initForm)
        {
            FormMain = initForm;
        }
        private static bool InitCheck()
        {
            return FormMain != null ? true: false;
        }
        public static void DoStuff()
        {
            if (InitCheck())
            {
                // Do your things
            }
            else
            {
                throw new Exception("Object reference not set to an instance of an object");
            }
        }
    }