【问题标题】:Static class initialization静态类初始化
【发布时间】:2020-04-14 15:51:06
【问题描述】:

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

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

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

【问题讨论】:

  • 您好!你的问题能回答这个问题吗?stackoverflow.com/questions/6721832/…
  • Venkata 你的意思是“这能回答你的问题吗”:)
  • 像所有其他类一样,静态类需要调用构造函数(new myClass)。只是一个静态类,该类只有一个实例,而不是多个实例。
  • 为什么你会认为创建了一个对象?我看不出你是如何从报价中得到的。
  • 静态对象仅在其任何成员正在使用时才会创建,请检查此codethis

标签: c# .net static


【解决方案1】:

如果我正确理解了您的问题,如果您不在代码中的任何位置调用静态类对象,您是否会对其进行初始化感兴趣。

所以,我只是用静态类创建了简单的控制台应用程序,并在构造函数中放入了一些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,我将重用同一个实例,如果您不在代码中调用该类,则根本不会创建实例,这就是我想微软文档所指的内容。

【讨论】:

  • 感谢您的努力!!但是,它保证在程序中第一次引用该类之前被加载并初始化其字段并调用其静态构造函数。 -- 这个陈述看起来与观察到的结果相反。
  • 其实并没有,因为“在你的程序中第一次引用类之前”的意思是如果它被实际引用,也保证在调用该引用之前被初始化该程序。但据我了解,它并没有说明场景,您根本没有在程序中引用这个静态类,显然它没有被初始化,而且我猜它有逻辑意义。
猜你喜欢
  • 1970-01-01
  • 2023-03-13
  • 1970-01-01
  • 2012-05-04
  • 2011-07-18
  • 2015-05-18
  • 1970-01-01
  • 1970-01-01
  • 2023-03-18
相关资源
最近更新 更多