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

22

根据 MSDN:

静态构造函数不需要访问修饰符或参数。

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

不能直接调用静态构造函数。

请问为什么静态构造函数不能有参数呢?


5
因为根据MSDN的规定,您无法直接调用它。 - Ian Mercer
2
@Hightechrider 从技术上讲,你也不能调用普通构造函数。表达式new Foo(x)不是对构造函数的显式调用,而是在由new返回的内存上调用构造函数。 - Motti
可能是将静态参数传递给类的重复问题。 - nawfal
11个回答

27

根据MSDN的说法,静态构造函数会在创建第一个实例之前自动调用以初始化类。因此,您无法向其发送任何参数。

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


8

静态构造函数是类型初始化的一部分自动调用的。它们不是显式调用...因此,你无法提供任何参数来对应构造函数参数。如果永远无法为参数指定值,为什么要允许参数呢?


8
如何控制传递给这样一个构造函数的参数,考虑到它在类第一次被引用时由运行时自动调用,不能直接调用?
理论上,可以设计和实现这样的语法,但这将需要直接调用它,因为现在一个简单的类引用不知道要传递什么参数。静态构造函数的整个意义是在使用类型之前执行类型级别的初始化。自动执行可以确保这一点,而直接调用则容易出错。

4
由于MSDN的规定,您无法直接调用静态构造函数:
静态构造函数不能直接调用。

2
一个静态构造函数不能带任何参数。我想理论上它是可以有参数的,但是由于没有类的实例,所以这种情况毫无意义。如果你有参数,你将如何处理它们?调用其他静态方法吗?

0
静态构造函数会在创建第一个实例或引用任何静态成员之前自动调用以初始化类。
静态构造函数不能直接调用。
静态构造函数无法显式调用,因此不需要传递任何参数。假设静态构造函数可以传递参数。现在,由于我们无法显式调用构造函数,这意味着必须在构造函数定义中给出需要传递的任何参数。例如:
class Sample
{
    int a;
    int b;
    static Sample(int a1=10, int b1=20)
    {
        this.a = a1;
        this.b = b1;
    }
}

如果你仔细想一下,这个定义是没有意义的,因为这些值本来就可以直接在构造函数中赋值,如下所示。
class Sample
{
    int a;
    int b;
    static Sample()
    {
         this.a = 10;
         this.b = 20;
    }
}

从某种程度上说,可以说CLR的隐式调用机制是静态构造函数不能有参数的原因。由于调用是隐式的,我们无法向构造函数传递不同的值,因此具有参数的目的被否定了。

0
创建一个空构造函数到静态类中,并将参数化的代码放在一个普通函数中。当你调用这个函数时,静态类将会被创建。
静态类:
static class DataB
{
    static DataB(){}

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

你可以像这样创建它:

DataB.funcWithParams("some string");

0

静态构造函数

由于静态构造函数是自动调用的(我们无法控制静态构造函数的调用),因此我们无法向静态构造函数传递参数。

如果我们无法向静态构造函数传递参数,那么为什么要创建带参数的静态构造函数呢?

因此,我们必须拥有无参数的静态构造函数。


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

0
静态构造函数会被CLR自动隐式调用,它是类中第一个要运行的代码块。我们无法向静态构造函数传递任何参数,因为这些函数是隐式调用的,如果要传递参数,我们必须显式调用它,而这是不可能的。
如需更多澄清,请参考此链接-输入链接描述

请务必在提供新答案之前阅读现有答案。在这种情况下,该问题已经存在十多年了,您所说的一切都已经被社区验证过的多个现有答案所说过了。 - Jeremy Caney

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接