C# 静态类不';除了实例类之外,不能先调用。为什么?

C# 静态类不';除了实例类之外,不能先调用。为什么?,c#,.net,static,C#,.net,Static,我知道,静态构造函数总是优先,并在任何实例构造函数之前首先被调用。但是,考虑一下我有一个实例类和一个静态类的场景。我想知道为什么结果首先来自基类,然后是静态类?我也验证了交换呼叫,我得到了相应的结果。但是我的想法是错误的,静态类总是应该首先被调用,而不考虑任何其他实例类吗?之所以向我提出这个问题,是因为我在某处看到,当触发包含该类的命名空间时,静态类会自动加载。然后我希望静态构造函数首先启动。为什么不发生呢?请有人用简单易懂的方式解释一下 public class Base {

我知道,静态构造函数总是优先,并在任何实例构造函数之前首先被调用。但是,考虑一下我有一个实例类和一个静态类的场景。我想知道为什么结果首先来自基类,然后是静态类?我也验证了交换呼叫,我得到了相应的结果。但是我的想法是错误的,静态类总是应该首先被调用,而不考虑任何其他实例类吗?之所以向我提出这个问题,是因为我在某处看到,当触发包含该类的命名空间时,静态类会自动加载。然后我希望静态构造函数首先启动。为什么不发生呢?请有人用简单易懂的方式解释一下

    public class Base
    {
        public Base() { Console.WriteLine(" I am from normal Base constructor"); }
        static Base() { Console.WriteLine("Hey I am from Static Base"); } 
    }
    public static class Base1
    {
        static Base1() { Console.WriteLine("I am from Static Constructor"); }
        public static void StaticMethod() { Console.WriteLine("I am from Static Method");   }            
    }

    static void Main(string[] args)
    {
        Base b = new Base();
        Base1.StaticMethod();
        Console.Read();
    }

只有一个保证:

类的静态构造函数在任何实例构造函数或该类的任何静态成员之前调用

这个保证没有说明调用静态构造函数的时间。大多数情况下,它将在实际使用静态类时被调用,而不是更早

在创建另一个类的实例之前,没有理由执行静态构造函数

你说:


我在某个地方看到,当包含该类的命名空间被触发时,静态类会自动加载

那是不对的,我想你可能误解了那里的一些东西

MSDN声明如下:

加载包含静态类的程序或命名空间时,.NET Framework公共语言运行库(CLR)会自动加载静态类


我明白这怎么会被误解。这里的“加载类”并不意味着它的构造函数被执行。这意味着CLR只需加载类型并对其执行一些验证。

在创建类实例或访问其静态方法()之前,会调用静态构造函数,因此得到的结果是正确的。

静态构造函数仅在实际需要时才被调用。如果需要,保证在类的正常构造函数之前调用它们

但不能保证所有静态构造函数都会在其他类的任何普通构造函数之前被调用

这样做并避免调用未使用的静态构造函数是不可能的。您可以做一些事情,比如只在程序终止之前使用静态构造函数访问类,然后仅在满足某些条件时访问。很明显,代码无法及时地预先确定是否需要静态构造函数调用;因此,在代码访问静态构造函数之前,它无法调用静态构造函数

查看更多详细信息

根据MSDN:

静态构造函数用于初始化任何静态数据,或 执行只需执行一次的特定操作。它是 在创建第一个实例或任何 静态成员被引用


因此,在您的例子中—首先调用基类构造函数,然后访问Base1静态方法。

您在哪里读到当触发包含该类的命名空间时,静态类会自动加载?“我在某处看到,当触发包含该类的命名空间时,静态类会自动加载。”如何“触发”命名空间?这是没有道理的。请发布一个指向神秘的“某处”的链接,不清楚它们的意思。嗨,Bumm和dasb,如果我误解了,很抱歉,但是你可以在MSDN中看到类似的语句,该链接说“当加载包含类的程序或命名空间时,.NET Framework公共语言运行库(CLR)会自动加载静态类。”嗯,是的。老实说,我还是不明白这句话。我理解下面有人解释的方式,但我发现难以理解MSDN在上述声明中试图传达的内容。非常感谢,是的,我可能误解了MSDN中给出的声明:(大多数时候我对MSDN的解释不太满意。哦,现在你的解释让我明白了MSDN的说法。我想,加载意味着也解雇了构造函数。非常感谢你对我的解释:):)非常感谢Matthew,这对我很有帮助。