静态方法在调试中很好但在发布中抛出了TypeInitializationException

时间:2009-03-20 01:33:19

标签: c# static debugging release

在这一个上敲我的头。我有一个静态方法,其类与此类似的字段:

public MyClass
{
   private static string m_myString;

   public static MyClass()
   {
       m_myString = "hello world";
   }

   public static void MyUsefulMethod(Foo bar)
   {
       DoStuffTo(bar);
   }

}

在调试模式下,我没有问题,但是一旦我发布,我就会得到 TypeInitializationExceptions

5 个答案:

答案 0 :(得分:0)

你不应该说:

private static string m_myString = "hello world";

答案 1 :(得分:0)

这通常是由于静态构造函数的运行顺序。

BTW:我认为非静态类的公共静态构造函数不是一个好主意,请尝试将其设为私有。

答案 2 :(得分:0)

@jeffamaphone ..我的代码示例中的拼写错误。

@Mitch Wheat:是的,它看起来像是什么样的,我的不好你不能为静态构造函数添加访问修饰符。

无论如何我现在都在使用它,看起来更像这样,为示例代码中的混乱道歉。

public MyClass
{
   private static Object m_object;

   static MyClass()
   {
      m_object = new Object();
   }  

   public static void MyUsefulMethod(Foo bar)
  {
      DoStuffTo(bar);
   }

}

现在生活又好了。如果我明白为什么,我会更开心。

感谢回复。

答案 3 :(得分:0)

静态问题的一个问题是,无法控制何时在程序加载时实例化它们。在DEBUG模式下,编译器以与RELEASE模式不同的方式执行许多操作。其中之一就是如何管理记忆。

很有可能你只是在DEBUG中幸运的是你的记忆没有被其他进程覆盖,并且当你的程序想要它时它就有价值。

我曾经使用的一种方法是Meyers Singleton的变体。 (这在C++ In Theory: The Singleton Pattern - J. Nakamura

中非常详细

虽然您不是在单身人士之后,但该方法可用于解决您的问题,如下所示:

class MySample
{
    MySample() {}
    <etc.>

    static const std::string& GetStaticValue() 
    {
        static std::string my_val = "Hello World";
        return my_val;
    }
}

Nakamura先生在上面的文章中非常好地解释了主要的好处:

这种结构依赖于函数静态对象仅在首次调用函数时被初始化的事实;因此我们保持动态初始化的好处。 (函数静态原始变量,如static int number = 100;但是在编译期间会被翻译!)

答案 4 :(得分:0)

TypeInitializationException是否出现在MyClass或其他类中?抛出异常时是否得到堆栈跟踪?

您显示的小代码并不表示错误,但我们无法看到Bar类或其他可能相关的代码。