2013-02-13 66 views
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(); 
    } 
+0

你在哪里阅读当包含该类的命名空间被触发时,静态类会自动加载? – Paparazzi 2013-02-13 13:16:23

+0

“我在某处看到,当包含该类的命名空间被触发时,静态类会自动加载。”你如何“触发”命名空间?这根本不符合逻辑。请发布一个链接到神秘的“某处”,但不清楚它们的含义。 – dasblinkenlight 2013-02-13 13:17:46

+0

嗨Blam和dasb,对不起,如果我误解了,但你可以在MSDN中看到类似的声明http://msdn.microsoft.com/en-us/library/79b3xss3(v=vs.80).aspx – Learner 2013-02-13 13:19:23

回答

0

静态构造函数只有在实际需要时才会调用。如果他们需要,他们保证在他们的班级的正常构造函数之前被调用。

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

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

查看Eric Lippert's Blog about Static Constructors了解更多详情!

+0

非常感谢你,马修,帮助我。 – Learner 2013-02-13 13:24:00

1

只有一个保证:

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

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

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

你说:

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

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

的MSDN指出以下:

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

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

+0

非常感谢你,是的,我可能误解了MSDN中给出的陈述:(我对MSDN解释大多数时间都不太舒服。http://msdn.microsoft.com/en-us/library/79b3xss3(v=vs .80).aspx – Learner 2013-02-13 13:23:16

+0

@Divine:请参阅我的回答更新 – 2013-02-13 13:25:55

+0

哦,现在你的解释让我明白MSDN的声明,我想,加载方法,解雇了构造函数。 ) – Learner 2013-02-13 13:28:49

1

根据MSDN:

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

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

+0

谢谢你的回答:) – Learner 2013-02-13 13:24:19

相关问题