架构师_程序员_码农网

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 20089|回复: 1

[资料] .net之.ctor和.cctor

[复制链接]
发表于 2017-4-6 14:56:38 | 显示全部楼层 |阅读模式
.ctor 是大家都知道的

.cctor 却不被人所熟习,也很容易被误用

所谓的的 .cctor 放在C#的语法中,就是静态的构造函数

形如




.cctor  与 .ctor之间的异同

   1,不能有访问权限标识符 public,private,等等,都不能使用,这与.ctor不同

   2,不能有返回值,这与.ctor相同

   3,不能有参数,.ctor可以拥有多个参数

   4,最多只能有一个,.ctor至少要有一个

   5,程序员不能控制调用.cctor的时机,.ctor 从某种意义上说,程序员可以控制它调用的时机

   6,程序员无法直接调用.cctor , .ctor 当程序员使用new操作符时,.ctor是一定会被调用的


.cctor 的调用时机 :


    在创建第一个实例或引用任何静态成员之前,将自动调用静态构造函数。(这是MSDN上的原话)

    很明显,同一个程序域中.cctor 只会调用一次,而不是像.ctor每次实例化对象都会被调用

.cctor用处

    静态构造函数用于初始化任何静态 数据,或用于执行仅需执行一次的特定操作。


举例说明:

以下所有代码 在 windows 7, vs 2005 Release 模式下编译确认,若结果不同,请考虑换成release模式重试




将此段代码编译,然后使用ILDASM查看,方法表如下

177598_1268325741Xn7V.jpg

.ctor() : void //这是由编译器自动提供的类的实例构造函数

Main():void(string[]) //程序入口点

很显然,程序集中并没有.cctor 的身影,在类没有静态的字段需要初始化时,编译器是不会自动提供.cctor函数的,这又与.ctor不同,无论怎样,.ctor一直存在

修改代码




编译此段代码,会有一个警告,但那并不重要的,重要的是用ILDASM查看程序集时,预料中的.cctor,静态构造函数并没有出现!
177598_1268325742ZspK.jpg

what happened?

难道推论错误了吗?.cctor并不是用来初始化类的静态字段?

take it easy ,请看一下段代码





此段代码与上一段代码的唯一不同就是变更了静态字段i的初始值,接下来,就是见证神奇的时刻

让我们DASM 它,令人吃惊的是,千呼万唤的.cctor终于出现了!
177598_1268325742MTaq.jpg


查看.cctor的实现代码,会看到

.method private hidebysig specialname rtspecialname static
        void  .cctor() cil managed
{
  // Code size       7 (0x7)
  .maxstack  8
  IL_0000:  ldc.i4.1  //实例化静态的字段 :-)
  IL_0001:  stsfld     int32 only_lonely.A::i
  IL_0006:  ret
} // end of method A::.cctor


为什么会是这样呢?可能的原因是 Int32 类型的默认值 就是 0,而编译器检测到了这个,所以便优化,不产生.cctor的代码

参考
https://msdn.microsoft.com/zh-cn/library/k9x6w0hc(VS.80).aspx

最后,我们可以自己实现一个.cctor函数,以实现特殊的功能需求

总结
1、.ctor是构造方法;
2、.cctor是类型初始化器,在C#中也就是静态构造函数;
3、当类C实例化时,会先对声明时就进行赋值的字段赋值,然后调用基类的构造函数,基类再以同样的方法构造自己,一直到顶层的System.Object,然后再回来执行C的显式构造方法中的代码,就是这么一个递归的过程。





上一篇:不支持泛型上下文绑定对象: ContextBoundObject与泛型类
下一篇:关于类中静态,非静态,构造方法的执行顺序总结
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

免责声明:
码农网所发布的一切软件、编程资料或者文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。

Mail To:help@itsvse.com

QQ|手机版|小黑屋|架构师 ( 鲁ICP备14021824号-2 )|网站地图

GMT+8, 2024-4-26 16:52

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表