首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >静态类初始化

静态类初始化
EN

Stack Overflow用户
提问于 2019-12-23 10:43:31
回答 1查看 1.4K关注 0票数 3

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

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

我们可以说在这里隐式地创建了一个对象吗?我确信,只编写静态类不会为其创建内存,除非在代码中引用静态类或其任何成员。如果我错了就纠正我。

EN

回答 1

Stack Overflow用户

发布于 2019-12-23 11:34:16

如果我正确地理解了您的问题,那么如果您不从代码中的任何地方调用静态类对象,您是否会对静态类对象进行初始化。

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

代码语言:javascript
复制
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(); }
}

我得到了以下输出:

代码语言:javascript
复制
Hello World!

然后,我使用静态类的访问权限运行程序:

代码语言:javascript
复制
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(); }
}

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

代码语言:javascript
复制
Hello World!
1
2
3

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

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59453933

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档