为什么静态构造函数没有任何参数?

时间:2011-07-21 06:02:32

标签: c# .net oop static-methods

每个MSDN:

  

静态构造函数不接受访问修饰符或具有参数。

     

在创建第一个实例或引用任何静态成员之前,会自动调用静态构造函数来初始化类。

     

无法直接调用静态构造函数。

任何人都可以解释为什么静态构造函数不能有参数?

9 个答案:

答案 0 :(得分:24)

正如MSDN所说, 在创建第一个实例之前,会自动调用静态构造函数来初始化类 。因此,您无法发送任何参数。

如果CLR必须调用静态构造函数,它将如何知道要传递哪些参数?

答案 1 :(得分:8)

静态构造函数作为类型初始化的一部分自动调用。它们没有被明确调用...所以你无法提供任何与构造函数参数相对应的参数。如果您永远不能为参数指定任何值,为什么要允许参数?

答案 2 :(得分:8)

如何控制传递给这样的构造函数的参数,因为它是第一次引用类时运行时自动调用的,并且不能直接调用?

理论上,可以设计和实现这样的语法,但是这样就需要直接调用,因为现在一个简单的类引用将不知道将什么作为参数传递给它。静态构造函数的要点是在使用类型之前执行类型级初始化。这样做会自动确保这种情况,而直接调用会留下足够的错误空间。

答案 3 :(得分:4)

因为您无法直接调用它(根据MSDN):

  

无法直接调用静态构造函数。

答案 4 :(得分:2)

静态构造函数不能包含任何参数。好吧,我认为理论上可以 - 但是没有类的实例,所以它没有任何意义。如果你有这些参数,你会怎么做?调用其他静态方法?

答案 5 :(得分:0)

  • 在第一个实例之前自动调用静态构造函数 该类已创建。
  • 通过在构造函数定义前添加一个static关键字来声明。
  • 它不能使用访问修饰符或具有任何参数。

答案 6 :(得分:0)

为静态类创建一个空构造函数,并将参数化代码放到普通函数中。如果调用此函数,将创建静态类。

静态类:

static class DataB
{
    static DataB(){}

    public static void funcWithParams(string st)
    {...}
}

您可以像这样创建:

DataB.funcWithParams("some string");

答案 7 :(得分:0)

静态构造函数

因为静态构造函数会自动调用(我们对调用静态构造函数没有任何控制权),所以我们无法将参数传递给静态构造函数。

如果我们不能将参数传递给静态构造函数,那么为什么我们要创建静态构造函数作为参数化。

因此,我们必须使用参数少的静态构造函数。

答案 8 :(得分:-1)

这是一个允许嵌套类访问表单控件而不将表单作为嵌套类参数的方法的示例。构造器:

public partial class Form1 : Form
{
    public int nWow;

    public Form1()
    {
        InitializeComponent();
        Inner.AssignMe(this); // This is where the real action is.
    }

    class Inner
    {
        static Form1 Me;

        static Inner(){} // empty static constructor necessary

           // Called AssignMe in the Form1 constructor in this code, 
           // but this can be generalized to any nested class.
        public static void AssignMe(Form1 form) { Me = form; }

        public Inner() { Me.nWow = 1; } // Now u can access public Form1
    }                        // members and methods even from the nested
}                            // class' constructor.

我根据上面的用户3567816的消息想出了这一点,虽然简洁而且有0票,但这绝不是最优雅的解决方案,而且非常独特。没有人对这类问题提出这样的建议。在嵌套类的建造者中没有更多但是更加冗长的形式参数!这绝对是辉煌的!!

我无法帮助,但是使用静态变量名称Me来提供VB.Net转。假笑。