在这一个上敲我的头。我有一个静态方法,其类与此类似的字段:
public MyClass
{
private static string m_myString;
public static MyClass()
{
m_myString = "hello world";
}
public static void MyUsefulMethod(Foo bar)
{
DoStuffTo(bar);
}
}
在调试模式下,我没有问题,但是一旦我发布,我就会得到 TypeInitializationExceptions 。
答案 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
类或其他可能相关的代码。