【问题标题】:Why does the constructor of my static class never seem to get called? [duplicate]为什么我的静态类的构造函数似乎从未被调用? [复制]
【发布时间】:2016-02-04 14:11:52
【问题描述】:

我正在用 C# 编写控制台应用程序。当应用程序运行时,我需要它在做任何工作之前检查一些事情,例如是否存在某些设置和目录。我有一个存储在Logging.cs 中的静态类,我已经在这个类的构造函数中进行了检查,但它似乎从未被调用过。

这是一个非常基本的例子:

Program.cs

internal class Program
{
    private static void Main(string[] args)
    {
        Console.WriteLine("Started application");
        Console.ReadKey(); // Stops the application exiting so I can read the output
    }
}

Logging.cs

internal static class Logging
{
    static Logging()
    {
        // The checks are all here, for the demo we'll just use WriteLine
        Console.WriteLine("Logging constructor");
    }
}

预期的控制台输出:

已启动应用程序
记录构造函数

我知道我可以在 Logging 类中创建一个名为 DoStartupChecks 的静态方法,并从 Program.cs 中的 Main 调用它,但我想了解我在这里做错了什么。也许答案是创建方法并调用它,但我想先了解为什么上面的例子是错误的。

【问题讨论】:

  • 你在上课吗?
  • 第一次使用类时调用静态构造函数,而不是在加载程序时。所以你的例子确实不会导致构造函数被调用。
  • 好吧,这是有道理的。我认为将其设为静态会创建一个实例并因此调用构造函数。这更有意义。谢谢。

标签: c# static console


【解决方案1】:

当一个类第一次被引用时调用静态构造函数,例如通过调用它的任何成员、创建它的实例或调用它的方法。

因此你必须这样写:

private static void Main(string[] args)
{
    Logging.DoSomething();
    Console.WriteLine("Started application");
    Console.ReadKey(); // Stops the application exiting so I can read the output
}

From MSDN:

它 [静态构造函数] 在创建第一个实例或任何其他实例之前自动调用 静态成员被引用。

【讨论】:

  • 所以我想我确实需要一个方法,通过调用该方法也会导致构造函数被调用?
  • 方法、常量、属性、字段……可以是任何东西。
  • 酷,这对我来说很有意义。我错误地认为将其设为静态就足够了。谢谢。 (我必须等待接受)。
猜你喜欢
  • 1970-01-01
  • 2013-12-04
  • 1970-01-01
  • 1970-01-01
  • 2012-11-16
  • 1970-01-01
  • 2011-11-16
  • 1970-01-01
  • 2015-04-28
相关资源
最近更新 更多