【问题标题】:When and who creates the instance of static class?何时以及由谁创建静态类的实例?
【发布时间】:2017-11-17 09:09:29
【问题描述】:

最近在面试中被问到一个问题。

面试官问了以下问题

-什么时候和谁创建了静态类的实例?显然,创建实例意味着在内存中分配空间。我们不能在不分配内存空间的情况下调用方法。

我很困惑,因为据我所知,静态类不会创建实例所以我在互联网上搜索,我发现静态类只有一次创建实例,即第一次调用第一个静态方法. 对吗?

第二个问题是谁创建了实例? 是CLR吗?

【问题讨论】:

  • 我相信静态类没有被实例化。
  • 静态类没有实例。
  • @toha 您发布的内容具有误导性(并且可能不正确)。
  • 文档提供了直接的答案 - docs.microsoft.com/en-us/dotnet/csharp/programming-guide/…... 澄清你在那里不明白的地方可能是个好主意。
  • 我相信您将 static classessingletons 混淆了。否则,将您的头衔视为福音将是雇主的一个诡计问题

标签: c#


【解决方案1】:

静态“实例”实际上在第一次代码引用静态类时被“实例化”(即,它们的静态构造函数被调用):

void Main()
{
    Console.WriteLine("Not instantiated yet!");
    Stat.A();
}

// Define other methods and classes here

static class Stat
{
    static Stat()
    {
        Console.WriteLine("Instantiated!");     
    }

    public static void A()
    {
        Console.WriteLine("A was called!");
    }
}

打印以下内容:

Not instantiated yet!
Instantiated!
A was called!

正如在其他地方提到的,这在技术上不是实例化,但它非常接近;您只需将其视为实例存在“其他地方”并且运行时为您管理它。

【讨论】:

  • 这是对 instance 一词的误用。调用静态构造函数并不构成实例化。
  • 最好不要将它们命名为“实例”,即使在引号中也是如此。它只是一个调用的静态类构造函数和初始化的字段。 stackoverflow.com/a/15177713/251311
  • @zerkms 同意,但从概念上讲并没有太大的差距,我认为在考虑实例与非实例时,心理模型存在过度复杂化的风险,这有助于只需将用于所有意图和目的的静态类视为单一的、全局的、类型名引用的实例。 (至少对我有用)
  • 确实,这取决于一个人想要变得多精确。对我来说,它是类型结构的一部分,我会尽可能避免不将其命名为“实例”。不过,这只是一种偏好。
【解决方案2】:

不能实例化静态类。换句话说,您不能使用 new 关键字来创建类类型的变量。因为没有实例变量,所以您可以使用类名本身来访问静态类的成员。

以下列表提供了静态类的主要功能:

  • 仅包含静态成员。
  • 无法实例化。
  • 已密封。
  • 不能包含实例构造函数。

【讨论】:

  • 但它可以包含静态构造函数,这就是我认为问题所指的。 dotnetfiddle.net/vFXDoe
  • 这个问题没有说任何关于静态构造函数的内容,但确实多次明确询问“创建实例”。
  • 同意可以包含静态构造函数,但不能使用new关键字创建实例。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-04
  • 2011-06-07
相关资源
最近更新 更多