奇怪的构造函数!!!

正常情况下,下面的代码:
namespace ClassLibrary1 {
    
public class Class1 {
        
private bool _bFlag;

        
public Class1() {
            _bFlag 
= true;
        }
    }
}
产生的IL代码应该是:
.method public hidebysig specialname rtspecialname
        instance void  .ctor() cil managed
{
  // 代码大小       14 (0xe)
  .maxstack  8
  IL_0000:  ldarg.0
  IL_0001:  call       instance void [mscorlib]System.Object::.ctor()
  IL_0006:  ldarg.0
  IL_0007:  ldc.i4.1
  IL_0008:  stfld      bool ClassLibrary1.Class1::_bFlag
  IL_000d:  ret
} // end of method Class1::.ctor


可是,我见到这样一段代码:
.method public hidebysig specialname rtspecialname
        instance void  .ctor() cil managed
{
  // 代码大小       14 (0xe)
  .maxstack  2
  IL_0000:  ldarg.0
  IL_0001:  ldc.i4.1
  IL_0002:  stfld      bool ClassLibrary1.Class1::_bFlag
  IL_0007:  ldarg.0
  IL_0008:  call       instance void [mscorlib]System.Object::.ctor()
  IL_000d:  ret
} // end of method Class1::.ctor

什么样的C#代码可以生产这样的IL呢?
先给变量赋值,然后才调用基类的构造函数。

找到原因了!
谢谢布鲁斯南提示。
C#代码是这样的:
namespace ClassLibrary1 {
    
public class Class1 {
        
private bool _bFlag = true;
    }
}
这时系统就会先给变量赋值,再去调用基类的构造函数。

posted on 2006-10-25 13:28 Voidclass 阅读(1472) 评论(3)  编辑 收藏 所属分类: H. Other

评论

#1楼  2006-10-25 13:45 曲滨      

namespace ClassLibrary1 {
public class Class1 {
private static bool _bFlag;
static Class1()
{
_bFlag=true;
}
public Class1() {
_bFlag = true;
}
}
}   回复  引用  查看    

#2楼 [楼主] 2006-10-25 14:32 Voidclass      

@曲滨
你的代码产生的IL:
.class public auto ansi ClassLibrary1.Class1
extends [mscorlib]System.Object
{
.field private static bool _bFlag
.method private hidebysig specialname rtspecialname static
void .cctor() cil managed
{
// 代码大小 7 (0x7)
.maxstack 8
IL_0000: ldc.i4.1
IL_0001: stsfld bool ClassLibrary1.Class1::_bFlag
IL_0006: ret
} // end of method Class1::.cctor

.method public hidebysig specialname rtspecialname
instance void .ctor() cil managed
{
// 代码大小 13 (0xd)
.maxstack 8
IL_0000: ldarg.0
IL_0001: call instance void [mscorlib]System.Object::.ctor()
IL_0006: ldc.i4.1
IL_0007: stsfld bool ClassLibrary1.Class1::_bFlag
IL_000c: ret
} // end of method Class1::.ctor

} // end of class ClassLibrary1.Class1

编译器生成了一个新的.cctor()构造函数,与我见到的不一样。   回复  引用  查看    

#3楼  2006-10-25 14:37 布鲁斯南      

申明变量的时候,有一个默认值吧.
可能编译器做了优化处理.   回复  引用  查看    


标题  
姓名  
主页
Email (只有博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2006-10-25 14:46 编辑过


相关链接:
 

导航

统计

与我联系

搜索

 

常用链接

留言簿(2)

我参与的团队

随笔分类(18)

随笔档案(18)

收藏夹(1)

友情博客

积分与排名

最新评论

阅读排行榜

评论排行榜