类中的静态和普通构造函数

本文关键字:构造函数 静态 | 更新日期: 2023-09-27 18:15:56

假设在一个类中有一个静态构造函数、一个普通构造函数和一个静态方法。

Main()中,我们的代码为:

Classname.staticmethod();

在这种情况下,在执行静态方法之前首先调用哪个构造函数?:-静态构造函数还是普通构造函数?

类中的静态和普通构造函数

你为什么不试试呢?

class Foo 
{
    static Foo() { Console.WriteLine("Static constructor is called."); }
    public Foo() { Console.WriteLine("The constructor is called."); }
    public static void Bar() { Console.WriteLine("The static Bar method is called."); }
}
public static void Main()
{
    Foo.Bar();
}

输出为:

// Static constructor is called.
// The static Bar method is called.

MSDN说关于静态构造函数:

在创建第一个实例之前自动调用,或者任何静态成员都被引用

没有调用实例构造函数,因为您没有创建实例。

有关构造函数执行顺序的更多信息,请查看这个问题

无论您是调用静态方法还是创建实例,都将始终调用静态构造函数。

假设有一个默认的实例构造函数,它将在调用new Classname();

时被调用。

静态构造函数只被自动调用一次。它将在执行静态方法或创建实例后立即调用。以先到者为准

所以在这种情况下,静态构造函数将被立即调用,因为您调用了静态方法。您可以将其视为创建静态类

的实例

来自静态构造函数(c#编程指南)

静态构造函数有以下属性:

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

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

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

•用户无法控制何时执行静态构造函数在程序中。

静态构造函数的典型用法是类使用日志文件和构造函数用于将条目写入该文件。 静态构造函数在创建包装器类时也很有用对于非托管代码,当构造函数可以调用LoadLibrary时方法。•如果静态构造函数抛出异常,则运行时不会抛出异常第二次调用它时,类型将保持未初始化您的程序所在的应用程序域的生命周期运行。

下面是我编写的一个快速示例来演示发生的情况:

using System;
namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Classname.staticmethod();
            Classname name = new Classname();
            Console.ReadLine();
        }
    }
    public class Classname
    {
        public static void staticmethod()
        {
            Console.WriteLine("staticmethod called");
        }
        static Classname()
        {
            Console.WriteLine("Static Constructor called");
        }
        public Classname()
        {
            Console.WriteLine("Instance Constructor called");
        }
    }
}
输出:

静态构造函数调用

静态方法调用

实例构造函数调用

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