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

Posted

技术标签:

【中文标题】如何将参数传递给静态类构造函数?【英文标题】:How to pass parameter to static class constructor? 【发布时间】:2016-03-17 02:38:02 【问题描述】:

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

public static class MyClass 

    static MyClass() 
        DoStuff("HardCodedParameter")
    

【问题讨论】:

您可能因为错误的原因而成功static。重新设计。 第一个问题确实是:为什么这个类是静态的?应该很少。 【参考方案1】:

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

public class A

    private static string ParamA  get; set; 

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

在 C# 中,静态构造函数是无参数的,几乎没有办法克服这个限制。一个是我上面建议的。

【讨论】:

但是无论如何使用方法有什么意义,因为有一个可用的设置器...... @meJustAndrew 因为那个 setter 是 private。你注意到那个重要的细节了吗? :D @meJustAndrew 也许另一种方法是ParamA private get; set; ... 顺便说一句,这只是一个代码 sn-p 显示您将使用一个或多个参数初始化一个静态类。可能一元构造函数是无用的,但如果你想涵盖将它提供给某个委托的用例,它仍然很有用...... 确实,我没有注意到该属性是private。我试图找到一种从课堂外初始化静态只读字段的方法,所以我找到了你的答案。不幸的是,它现在似乎不是 C# 中的这种机制。再次抱歉,上面的评论是我的错! @meJustAndrew 没问题 :D 无论如何,您可以模拟您想要提供的 Lazy<T> 实例而不是值【参考方案2】:

根据 MSDN,A static constructor is called automatically to initialize the class before the first instance is created。因此您不能发送任何参数。

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 方法。 如果静态构造函数抛出异常,运行时将不会再次调用它,并且该类型将保持未初始化状态 您的程序所在的应用程序域的生命周期 正在运行。

【讨论】:

方法Create应该是public被调用并初始化StaticClass 你能多解释一下你的代码吗?在我看来,这只是一个 Singleton 减去 null 检查以查看 _foo 是否是一个对象。如果没有那个空检查,这将允许 Create() 的所有调用者在内存中保留 StaticClass 的孤立对象,因为新实例被分配给静态变量 _foo,对吗?谢谢!【参考方案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);
    

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

【讨论】:

【参考方案4】:

非静态类的构造函数的好处是确保它们在实际使用之前被正确初始化。

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

使用具有明显名称的静态构造函数,然后在静态过程的相关部分检查以确保已执行初始化。 下面的示例假设您希望使用 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");
            
        
    

【讨论】:

以上是关于如何将参数传递给静态类构造函数?的主要内容,如果未能解决你的问题,请参考以下文章

如何将构造函数参数传递给 AppDomain.CreateInstanceXXX?

我如何将参数传递给构造函数? [关闭]

将参数传递给超类构造函数

将参数传递给基类构造函数

试图将类作为参数传递给不同的类构造函数,但出现“转换”错误

如何将 unique_ptr 对象作为参数传递给作为库的类