0

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

    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();
    }
4

4 回答 4

1

只有一个保证:

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

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

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

你说:

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

那是不正确的,我想你可能误解了那里的东西。

MSDN 声明如下:

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

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

于 2013-02-13T13:14:00.403 回答
1

根据 MSDN:

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

所以在你的情况下 - 首先你调用 Base 类构造函数,然后你正在访问 Base1 静态方法。

于 2013-02-13T13:15:09.477 回答
0

在创建类的实例或访问其静态方法之一( http://msdn.microsoft.com/en-us/library/k9x6w0hc(v=vs.80).aspx)之前调用静态构造函数,所以你得到的结果是正确的。

于 2013-02-13T13:14:18.920 回答
0

只有在实际需要时才调用静态构造函数。如果需要它们,则保证在其类的普通构造函数之前调用它们。

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

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

查看Eric Lippert 的关于静态构造函数的博客了解更多详细信息!

于 2013-02-13T13:14:53.843 回答