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

本文关键字:任何 参数 静态 构造函数 为什么 | 更新日期: 2023-09-27 18:03:03

每个MSDN:

静态构造函数不接受访问修饰符,也没有形参。

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

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

谁能解释一下为什么静态构造函数不能有参数?

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

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

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

静态构造函数作为类型初始化的一部分被自动调用。它们没有被显式调用…所以没有地方可以提供任何参数来对应构造函数参数。如果不能为参数指定任何值,为什么要允许参数呢?

如果该类在第一次被引用时由运行时自动调用,而不能直接调用,那么如何控制传递给这样一个构造函数的参数呢?

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

因为你不能直接调用它(根据MSDN):

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

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

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

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

静态类:
static class DataB
{
    static DataB(){}
    public static void funcWithParams(string st)
    {...}
}

你可以这样创建:

DataB.funcWithParams("some string");

静态构造函数

因为静态构造函数是自动调用的(我们对静态构造函数的调用没有任何控制),这就是为什么我们不能给静态构造函数传递参数的原因。

如果不能传递参数给静态构造函数,那么为什么要创建参数化的静态构造函数呢?

所以,我们必须有一个无参数的静态构造函数。

静态构造函数由CLR自动隐式调用,它是在类下运行的第一个代码块。我们不能向静态构造函数传递任何参数,因为静态构造函数是隐式调用的为了传递参数,我们必须显式调用这是不可能的

有关更多说明,请参阅此处输入链接描述

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

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

静态构造函数不能显式调用,因此不带任何形参。让我们假设静态构造函数可以传递参数。现在,由于我们不能显式地调用构造函数,这意味着需要传递的任何参数都必须在构造函数定义本身中给出。例如

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的隐式调用机制是静态构造函数不能有参数的原因。隐式调用不允许我们向构造函数传递不同的值,因此具有形参的目的就无效了。

下面是一个允许嵌套类访问表单控件而不将表单作为参数传递给嵌套类的构造函数的方法示例:

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.

我是根据上面user3567816的消息得出这个结论的,尽管这个消息很简洁,只有0个投票,但它绝对是迄今为止最优雅的解决方案,而且非常独特。没有人对这种问题给出这样的建议。在嵌套类的构造函数中再也没有丑陋的冗余表单参数了!这真是太棒了!!

我忍不住给了一个VB。Net twist使用静态变量名Me。假笑。