C# 静态方法在调试中正常,但在发行版中引发TypeInitializationException

C# 静态方法在调试中正常,但在发行版中引发TypeInitializationException,c#,static,debugging,release,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); } } 在调试模式下,我没有问

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

public MyClass
{
   private static string m_myString;

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

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

}
在调试模式下,我没有问题,但一进入发行版,我就得到类型初始化异常

您不应该说:

private static string m_myString = "hello world";

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


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

@jeffamaphone。。是的,我的代码样本中有输入错误

@米奇·麦特:是的,这就是它看起来的样子,我的缺点是你不能向静态构造函数添加访问修饰符

不管怎样,我现在已经可以工作了,看起来更像这样,为示例代码中的混乱道歉

public MyClass
{
   private static Object m_object;

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

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

}
现在生活又好起来了。如果我能理解为什么,我会更高兴


感谢您的回复。

静态的问题之一是,在加载程序时,您无法控制何时实例化它们。在调试模式下,编译器执行的操作与在发布模式下不同。其中之一就是它如何管理内存

很可能您只是在调试中幸运地发现,您的内存没有被其他进程覆盖,并且当您的程序需要时,该值就在那里

我使用的一种非常有效的方法是Meyers Singleton的变体。(这一点在

虽然您不追求单身,但该方法可用于解决您的问题,如下所示:

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

    static const std::string& GetStaticValue() 
    {
        static std::string my_val = "Hello World";
        return my_val;
    }
}
类MySample
{
MySample(){}
static const std::string和GetStaticValue()
{
静态std::string my_val=“Hello World”;
归还我的支票;
}
}
Nakamura先生在上述文章中很好地解释了主要好处:


这种构造依赖于这样一个事实:函数静态对象仅在函数第一次被调用时才被初始化;因此我们保持了动态初始化的好处。(函数静态原语变量,如static int number=100;但是在编译时确实会被转换!)类型初始化异常是发生在
MyClass
中还是发生在其他类中?引发异常时是否会得到堆栈跟踪


你所显示的小代码并不表示错误,但是我们不能看到 Bar <代码>类,或者其他可能相关的代码。

我不知道这是否重要,但是尝试删除MyCub()上的公共限定符。MyCype()是否抛出异常?这很有趣,但是C不是C++。