静态代码的运行顺序

时间:2009-09-22 12:09:07

标签: c# .net asp.net-mvc

我正在使用.Net mvc开展项目。我有一个包含静态构造函数和一些静态文件的csharp类。

    private static Class1 obj1 = new Class1();
    private static Class2 obj2 = new Class2();


    static Foo()
    {
       Init();
    }

   private static void Init()
   {
       obj1.DoSomething();
       obj2.DoSomething();
   }

此类是我的DomainModel的一部分,在我的Controller代码中引用。当我用VS2008运行项目时。在Controller代码使用obj1和obj2之前,似乎调用了Init()。但是当我将代码部署到虚拟服务器时,似乎根本没有调用Init()。有没有办法保证这些方法的执行顺序?

4 个答案:

答案 0 :(得分:6)

假设您真正引用此类(不仅仅是派生类中的静态方法),那么C#规范保证静态变量被初始化,然后执行静态构造函数。同样,假设不涉及部分类,C#规范保证在obj1之前初始化obj2

如果您在obj1obj2构造函数中使用其值,则只能在调用Init()之前“看到”Class1Class2 (因为那些构造函数将被称为初始化静态变量的一部分)。

现在,在没有看到其余代码的情况下,很难用更具体的术语来讨论。如果你能够产生一个证明问题的short but complete example,那么就更容易详细讨论了。

答案 1 :(得分:0)

嗯,我很不舒服它被称为。当您在C#中使用静态构造函数时,C#将“beforefieldinit”属性应用于您的类,因此保证在第一次使用类型的静态成员之前的某个时刻调用静态构造函数。

那么,你真的使用静态成员吗​​?如果不这样做,则无法保证静态构造函数将执行。

答案 2 :(得分:0)

我不完全理解你的问题。假设你想在每个Action被调用之前做一些动作,那么“Action Filter”就是你的朋友。见link

答案 3 :(得分:0)

好的,我发现了问题。真正的问题是一些时髦的I18n问题。当我使用vs2008启动应用程序时,从视图传递到我的控制器的参数使用GB2312进行编码,当我部署到虚拟服务器时,参数使用带有损坏值的utf-8进行编码。我不知道如何配置虚拟服务器以在GB2312中发送值,所以我只删除了我的中文字符串的依赖项,然后再次正常工作。 谢谢你们所有精彩的答案。