静态类初始化

时间:2019-12-23 10:43:31

标签: c# .net static

在.Net中,静态类是在内部创建一个对象还是根本不创建任何对象。根据Microsoft文档

  

与所有类类型一样,在加载引用该类的程序时,.NET Framework公共语言运行库(CLR)会加载静态类的类型信息。程序无法确切指定何时加载类。但是,保证在第一次在程序中引用该类之前,将其加载并初始化其字段并调用其静态构造函数。静态构造函数仅被调用一次,并且静态类在程序所驻留的应用程序域的生存期内保留在内存中。

我们可以说这里隐式创建了一个对象吗?我确信,仅在编写静态类或其任何成员在代码中的某些位置引用之前,编写静态类不会为其创建内存。如果我错了请纠正我。

1 个答案:

答案 0 :(得分:0)

如果我正确理解了您的问题,那么您有兴趣在不从代码中任何地方调用静态类对象的情况下对其进行初始化。

因此,我刚刚使用静态类创建了简单的控制台应用程序,并在构造函数中放置了一些Console.WriteLine命令,如下所示:

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("Hello World!");
    }
}
static class SomeClass
{
    static SomeClass()
    {
        Console.WriteLine(GetId(1));
        Console.WriteLine(GetId(2));
    }
    public static string GetId(int Id) { return Id.ToString(); }
}

我得到以下输出:

Hello World!

然后我可以访问静态类来运行程序:

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("Hello World!");
        Console.WriteLine(SomeClass.GetId(3));
    }
}
static class SomeClass
{
    static SomeClass()
    {
        Console.WriteLine(GetId(1));
        Console.WriteLine(GetId(2));
    }
    public static string GetId(int Id) { return Id.ToString(); }
}

在这里,我的控制台输出是:

Hello World!
1
2
3

这意味着,如果您未在程序中调用该类,则不会初始化该类,因此不会相应地创建该对象。 但是,如果您访问该类,则会在代码中首次访问该对象之前创建该对象,这意味着构造函数在首次调用该对象时就创建了它,而没有单独的初始化,例如:var _someClass = new SomeClass();,它是在第一次访问之前创建的,并且在程序的生命周期内仅创建一次,并且无论您在代码中调用它多少次,在首次初始化之后,实例都会一直存在,直到您的软件运行为止,无论它在多少次使用或在什么地方使用函数或整个程序中此SomeClass的属性,我将重用同一实例,如果您不在代码中调用该类,则根本不会创建该实例,这就是Microsoft文档所指的