1

把我的头撞到这个上。我有一个静态方法,其类中的字段类似于:

public MyClass
{
   private static string m_myString;

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

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

}

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

4

5 回答 5

0

你不应该说:

private static string m_myString = "hello world";
于 2009-03-20T01:42:17.393 回答
0

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

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

于 2009-03-20T01:44:48.197 回答
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);
   }

}

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

感谢您的回复。

于 2009-03-20T01:59:59.377 回答
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;但是在编译期间会被翻译!)

于 2009-03-20T02:11:15.263 回答
0

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

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

于 2009-03-20T03:40:13.957 回答