首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET Framework >

简单被忽视,错用的构造函数 .cctor- 静态构造函数

2012-12-22 
容易被忽视,错用的构造函数 .cctor-- 静态构造函数本帖最后由 amandag 于 2010-03-12 08:21:11 编辑.ctor

容易被忽视,错用的构造函数 .cctor-- 静态构造函数
本帖最后由 amandag 于 2010-03-12 08:21:11 编辑 .ctor 是大家都知道的

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

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

形如


class  A

{

   static A() // 这就是一个.cctor构造函数

}


.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模式重试





using System;
namespace only_lonely
{
    class A
    {
        static void Main(String[] args)
        {

        }
    }
}


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



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

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

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

修改代码


using System;
namespace only_lonely
{
    class A
    {
   
        static void Main(String[] args)
        {

        }

        static Int32 i = 0;
    }
}


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





what happened?

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

take it easy ,请看一下段代码


using System;
namespace only_lonely
{
    class A
    {
   
        static void Main(String[] args)
        {

        }

       static Int32 i = 1;
    }
}


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

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



查看.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的代码

  参考

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


[最优解释]
有心了, 推荐
[其他解释]
绝对原创,推不推荐都无所谓,版主如果看到了,帮忙看看其中有什么疏漏,有的话,请帮忙修改下,万分感谢
P.S. 感谢这么晚了还不睡的压腿大牛,以及打牌又输了的一支熊猫 :-)
[其他解释]
一直以来都有两派斗急的场面
就像这IL一样。
以老赵为反而派提议不学il
而以另外一位同学则极大程序推il
 我早已不知所云了

[其他解释]

引用:

哟,小培华不去水源``改到这来混了?
[其他解释]
哥早已退出水源
可水源还留着哥的传说 。

[其他解释]
和汇编代码一样,把IL代码拿给我看,里面有些东西我认识,有些我不认识,整体大概的意思我懂,叫我自己用IL写个``抱歉,俺不会. ...
[其他解释]
引用:
哥早已退出水源
可水源还留着哥的传说 。

呀呀个呸!
真正的传说在这里~水源大才子~ 熊猫湿淫!
[其他解释]
不错..............
[其他解释]
这么厉害。。。。
[其他解释]
学习了,最近正在学习中。。。
[其他解释]
学习了,谢谢哦
[其他解释]
学习,学习…………
[其他解释]
呀,真的被推荐了~ happy~
[其他解释]
不懂~~        
[其他解释]
wa wa wa w aawwa  wa  wa a 
[其他解释]
诗人真是才艺双全
[其他解释]
该回复于2012-08-28 09:31:44被版主删除
[其他解释]
躲猫猫党第一任主席隐身帮顶
[其他解释]
学习了,每天回帖是个习惯!
[其他解释]
诗淫啊 没想到啊 没想到~
[其他解释]
学习学习 哈哈哈哈哈
[其他解释]
引用:
一直以来都有两派斗急的场面
就像这IL一样。
以老赵为反而派提议不学il
而以另外一位同学则极大程序推il
我早已不知所云了
il...还是学下比较好吧.
[其他解释]
强强强强强强强强强强强强强强强强强强强强强强强强强强强
[其他解释]
wd
[其他解释]
學習了~~
------其他解决方案--------------------


引用:
诗人真是才艺双全


才貌双全...
[其他解释]
支持下,能赚分么
[其他解释]
这个还没有意识到呢。。。
[其他解释]
学习,学习下
[其他解释]
非常感谢!!
[其他解释]
学习,学习下
[其他解释]
???????
[其他解释]
研究贴,收藏了,谢谢~~
[其他解释]
历史上英雄是被传说出来的
[其他解释]
学习了!!!!!!!!!!
[其他解释]
义乌最大型的网络服务器在线下载三枪主题曲:http://www.yw93.com/三枪拍案惊奇主题曲.mp3
[其他解释]
學習了~~
[其他解释]
我给你推!~
[其他解释]
学习,学习下
[其他解释]
学习,很不错
[其他解释]
学习了……!
[其他解释]
学习了。。。。。。。。。。。。
[其他解释]
学习,学习,顶
[其他解释]
引用:
诗人真是才艺双全

嘿~~
[其他解释]
很有用。
[其他解释]
构造函数也有静态啊
[其他解释]
学习收藏了,谢谢分享啊!!!!!!
[其他解释]
学习了
[其他解释]
学习了哈
[其他解释]
il 学学还是有帮助的.
[其他解释]
学习了........
[其他解释]
引用:
构造函数也有静态啊

是的,最多能有一个
[其他解释]
学习了
[其他解释]
211.232.4.200有详解
[其他解释]
哥早已退出水源
可水源还留着哥的传说 。
[其他解释]
                                                                     


             u                             
u                        
[其他解释]
借鉴,学习学习
[其他解释]
学习了!
[其他解释]
懂一点了!!!!!!
[其他解释]
学习中。。谢谢分享
[其他解释]
该回复于2010-03-15 10:05:24被版主删除
[其他解释]
该回复于2010-03-15 10:05:25被版主删除
[其他解释]
学习 学习
[其他解释]
学习,很不错
[其他解释]
整一下跑啊!
[其他解释]
你很细心...但是,MSDN说的很清楚了...

静态构造函数用于初始化任何静态数据,即有任何静态字段却没有显式声明静态构造函数都会导致编译器为类自动添加静态构造函数...

然而不幸地是...C# 2.0编译器在优化时对“只有赋默认值的静态字段”不会自动添加静态构造函数,这在更高版本已被修改,以后你不会看到这种奇怪的事了...

ps:这种编译器的小差异知道就行了,不会有什么影响...什么“忽视”、“错用”搞这么隆重就太孔乙己了...
[其他解释]
好文章,谢谢了,希望多写一些这方面的文章!
[其他解释]

引用:
你很细心...但是,MSDN说的很清楚了...

静态构造函数用于初始化任何静态数据,即有任何静态字段却没有显式声明静态构造函数都会导致编译器为类自动添加静态构造函数...

然而不幸地是...C# 2.0编译器在优化时对“只有赋默认值的静态字段”不会自动添加静态构造函数,这在更高版本已被修改,以后你不会看到这种奇怪的事了...

ps:这种编译器的小差异知道就行了,不会有什么影响.……

大牛指教~收下``,其实那个优化`算是偶然发现``,我以前还不知道有.cctor那回事呢```
[其他解释]
学习!!!!!!!!!!!!!!
[其他解释]
是有这个问题呵呵。。。 。。。
[其他解释]
2010年北京会计从业资格证考试答案QQ;44123168;北京会计从业资格证

2010年河北从业资格证考试答案QQ:44123168; 河北从业资格证


2010年广东导游考试答案QQ70740055;广东导游考试

2010年期货从业资格考试答案QQ22315471  期货从业资格考试

2010年湖北教师资格考试答案QQ:22315471    湖北教师资格证考试

2010年山西教师资格考试答案QQ22315471    山西教师资格证考试



2010年湖北导游考试答案QQ70740055;湖北导游考试
[其他解释]
学习了............

[其他解释]
mark...
[其他解释]
学习。。。。
[其他解释]
这一点对我们有什么影响呢?
有刚需就些静态构造洒,不会为了写而写的
[其他解释]
null
[其他解释]
每天回帖即可获得10分可用分
[其他解释]
static Int32 i = 0;会有警告信息的吧.

------其他解决方案--------------------


贿赂斑竹?
[其他解释]

引用:
static Int32 i = 0;会有警告信息的吧.

是滴,变量i从未被使用~,其他的警告则没有,在.net 2.0下如此,更高版本不清楚

热点排行