C# 静态成员变量未在版本中初始化-编译器/clr错误?
在VS2010、.NET 4.0下的调试模式和发布模式下获得的预期输出和输出:C# 静态成员变量未在版本中初始化-编译器/clr错误?,c#,.net-4.0,clr,C#,.net 4.0,Clr,在VS2010、.NET 4.0下的调试模式和发布模式下获得的预期输出和输出: bar construct main 在VS2010调试器和WinDbg下,以发布模式不输出: main 程序在VS2005、.NET 2.0上不显示此行为 using System; namespace static_init { public class bar { public bar() { Console.WriteLine("b
bar construct
main
在VS2010调试器和WinDbg下,以发布模式不输出:
main
程序在VS2005、.NET 2.0上不显示此行为
using System;
namespace static_init
{
public class bar
{
public bar()
{
Console.WriteLine("bar construct");
}
}
class Program
{
public static bar blah = new bar();
static void Main(string[] args)
{
Console.WriteLine("main");
Console.ReadLine();
}
}
}
可能相关:
更新
在我的实际代码构造函数<代码>()(代码)>中,用C++(非托管)初始化一些互操作代码。它需要在这个库中的任何事情之前发生-是否有任何方法可以确保在不插入触及库中所有静态(带有未被外部引用的副作用)的
init()
函数的情况下
未来搜索者注意:我使用的是SWIG,这是他们在包装器生成代码中做出的假设SWIGStringHelper
是目前的罪犯,但可能还有更多
结论
更新到SWIG的2.0版,它会根据更新版本的.NET的需要放入静态构造函数。它可能会得到优化,因为您不使用它 它也不是一个编译器错误,它在语言规范中 17.4.5.1静态字段初始化 静态字段变量初始值设定项 类声明的 指定的作业顺序: 以文本顺序执行,其中 它们出现在类声明中。 如果是静态构造函数(§17.11) 存在于类中,执行 出现静态字段初始值设定项 在执行之前 静态构造函数。否则 执行静态字段初始值设定项 在依赖于实现的时间 在首次使用静电传感器之前 该类的字段 由于您从未使用过Program类的静态字段,因此静态初始值设定项不能保证运行(尽管它可能…上面的“依赖于实现的时间”) 更新
您可以通过使程序具有静态构造函数来实现所需的功能
静态程序(){}
或者可能通过访问另一个(可能是虚拟的)静态变量注意.NET 4.0中关于静态初始化的一些更改。Jon Skeet写了一篇带有一些示例的博客文章: 如果想要精确初始化,应该使用静态构造函数(可能为空)
非常感谢“更新”和“结论”-我有非常相似的场景,也使用了旧的SWIG 1.3.40-刚刚更新到2.0.9,一切正常。“结论”为我节省了大量的调查时间!
using System;
namespace static_init
{
public class bar
{
public bar()
{
Console.WriteLine("bar construct");
}
}
class Program
{
public static bar blah = new bar();
// This static constructor will make sure that the type Program
// is initialized before it is first used.
//
static Program()
{ }
static void Main(string[] args)
{
Console.WriteLine("main");
Console.ReadLine();
}
}
}