静态构造方法执行错误(.net 4下用release编译)

崔鹏飞 2010-07-31 12:35:53
要重现这个问题的代码很简单:
class Program
{
private static ClassA a = new ClassA();

static void Main(string[] args)
{
Console.ReadLine();
}
}

class ClassA
{
static ClassA()
{
Console.WriteLine("A cctor");
}
}


只要访问ClassA,它的静态构造方法就会执行。
所以程序一运行就应该输出“A cctor”。
实际上如果target framework设为.net 2.0或者3.5的话输出结果都是“A cctor”。
但是如果target framework是.net 4而且用release编译的话,编译出的程序集脱离IDE运行(在VS里运行结果还是对的)时则没有输出任何东西。

太奇怪了,哪位知道如何解决请帮忙,谢谢。
...全文
122 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
崔鹏飞 2010-08-22
  • 打赏
  • 举报
回复
还是不好结贴啊
lzj314145738 2010-08-02
  • 打赏
  • 举报
回复
静态方法是不能将其实例化的
只能执行一次
崔鹏飞 2010-08-02
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 hzzasdf 的回复:]

看了楼主给的连接,受教了。可惜,我因为没有自己动手做过,碰到过这个问题,又花时间想解决方法,所以只能是一种“概念上”的了解,而无法象楼主一样,加深对于静态对象的理解。实在羡慕楼主!
[/Quote]
也是在用GDAL的时候遇到的这个问题吗?
崔鹏飞 2010-08-02
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 hzzasdf 的回复:]

看了楼主给的连接,受教了。可惜,我因为没有自己动手做过,碰到过这个问题,又花时间想解决方法,所以只能是一种“概念上”的了解,而无法象楼主一样,加深对于静态对象的理解。实在羡慕楼主!
[/Quote]
也是用GDAL时遇到的?
  • 打赏
  • 举报
回复
看了楼主给的连接,受教了。可惜,我因为没有自己动手做过,碰到过这个问题,又花时间想解决方法,所以只能是一种“概念上”的了解,而无法象楼主一样,加深对于静态对象的理解。实在羡慕楼主!
崔鹏飞 2010-08-01
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 sp1234 的回复:]

在编译器检查到从来不使用的 private static 对象,是否必须写在类的 cctor 过程中,我没有见过这个规范!过去我们都是根据编译器编译出来的结果来解释,来说明它被编译到cctor的第一行那个地方,但是这毕竟不是规范,而是我们自己去解释。
[/Quote]
在一本书上看到过说静态字段的初始化是放到类的静态构造方法中的。具体是哪本书忘了......
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 cuipengfei1 的回复:]
嗯?不被注意啥意思呢?
[/Quote]

因为没有规范,所以对问题的分类上,只能判断为“新特性”,而不是一个Reopen的bug。这就是内部的问题处理流程。
  • 打赏
  • 举报
回复
在编译器检查到从来不使用的 private static 对象,是否必须写在类的 cctor 过程中,我没有见过这个规范!过去我们都是根据编译器编译出来的结果来解释,来说明它被编译到cctor的第一行那个地方,但是这毕竟不是规范,而是我们自己去解释。

崔鹏飞 2010-08-01
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 sp1234 的回复:]

那一句“Console.WriteLine”之所以不被注意,是因为那样写对于实际产品没有什么意义。

当然,对于微软可能有点意义。
[/Quote]
嗯?不被注意啥意思呢?
崔鹏飞 2010-08-01
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 sp1234 的回复:]

如果我的程序员写这种代码C# code
static void Main(string[] args)
{
Console.ReadLine();
}


那么我直接删除这种成事不足的代码就完了,何必管它呢?
[/Quote]
我帖子里面写的只是个重现问题的例子。
swig在给非托管类库生成托管的包装时会依赖于静态字段初始化的时机,我在用它的时候遇到了问题,所以才有这么一问。
我在这儿:http://www.cnblogs.com/cuipengfei/archive/2010/08/01/1790091.html把问题记下来了。
  • 打赏
  • 举报
回复
那一句“Console.WriteLine”之所以不被注意,是因为那样写对于实际产品没有什么意义。

当然,对于微软可能有点意义。
  • 打赏
  • 举报
回复
如果我的程序员写这种代码
        static void Main(string[] args)
{
Console.ReadLine();
}

那么我直接删除这种成事不足的代码就完了,何必管它呢?
wxm3630478 2010-07-31
  • 打赏
  • 举报
回复
静态构造方法的作用就是为了给一些静态变量赋初始值的

所以:
private static ClassA a = new ClassA();

肯定会执行它的静态构造方法,但是静态构造方法只会被执行一次
崔鹏飞 2010-07-31
  • 打赏
  • 举报
回复
哪位知道为什么请帮忙。
崔鹏飞 2010-07-31
  • 打赏
  • 举报
回复
现怀疑是个breaking change
崔鹏飞 2010-07-31
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 wxm3630478 的回复:]

静态构造方法的作用就是为了给一些静态变量赋初始值的

所以:
private static ClassA a = new ClassA();

肯定会执行它的静态构造方法,但是静态构造方法只会被执行一次
[/Quote]

我也是这么想的啊。
但是target framework设为.net 4,用release编译,并且在IDE之外运行的时候就没有执行。

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧