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
中还是发生在其他类中?引发异常时是否会得到堆栈跟踪
你所显示的小代码并不表示错误,但是我们不能看到