跟小静读CLR via C#(06)- 构造器

最近忙着看新还珠,好几天不学习了。玩物丧志啊,罪过罪过。

今天总结的是类构造器的知识,其实这方面的文章蛮多的,可还是觉得亲自写一下对自己的思考和认识会有提高。


对于构造器,大家应该都不陌生,它主要是用来进行初始化状态的。包括实例构造器和类构造器两种,先给大家看个实际的例子。

class Dog : Animal
    {

字段   
实例构造器     
类构造器

}

基类Animal

一 实例构造器

实例构造器主要负责将类型的实例初始化到一个合理的状态。引用类型和值类型的实例构造器是有所区别的。

1. 引用类型实例构造器

实例构造器可以进行重载,而且可以具有不同的访问限制。上面例子中①②③都是引用类型实例构造器。

实例构造函数和类名相同,但是没有返回类型。在ILDasm.exe中查看为.ctor。

如果我们没有定义实例构造器,那么编译器会为我们默认产生一个无参构造器。

实例对象初始化过程

  • 为实例分配内存;
  • 初始化附加成员,包括方法表指针和SyncBlockIndex变量(我们已经在 跟小静读CLR via C#(03中已经提到过)。
  • 调用实例构造器进行初始化。

在调用构造函数前,变量被初始化为0或者null,所以没有被构造器改变的变量在实例创建后将保持0值。例如下面的age字段保持0值

调用顺序

如果类没有显示定义构造器,编译器会自动生成一个无参构造器,调用基类的无参构造器。例如

public class Animal{}

相当于

public class Animal

{

public Animal():base(){}

}

如果类的修饰符为static(sealed和abstract),编译器不会默认生成构造器;

如果基类没有提供无参构造器,那么派生类必须显示调用一个构造器,否则编译错误。

如果存在继承关系,派生类在使用基类的字段之前应该先调用基类的构造器。如果派生类没有显式调用基类构造器,则编译器会自动产生调用基类无参构造器的代码,沿着继承层次一直到System.Object的无参构造器位置。例如下面,调用Dog dog=new Dog()方法的结果。

class Dog:Animal。。。

Dog()方法IL代码

代码爆炸?

为了防止构造器重载时大量重复赋值造成代码膨胀,我们建议将公共的初始化语句放在一个构造函数中,然后其他的构造器显式调用该构造器。

2. 值类型实例构造器
  • 值类型没有默认产生的无参构造器,也不允许我们定义无参构造器。但是我们可以自定义带参数的构造器。

  • 不允许在值类型中内联实例字段的初始化。下面的例子会产生编译错误。

    struct TestStruct
        { 
           partial int number=5;
        }
  • 值类型带参构造函数必须对所有实例字段进行初始化才可以。如果有变量没有初始化,就会报错。

如果不想对所有字段一一初始化,有一种替代方案:

  struct Dog
    {
        public int age;
        public string name;
        public Dog(string Name)
        {
            this = new Dog();
            name = Name;
        }
    }

在值类型构造器中,this代表值类型本身的一个实例,用New创建的值类型实例赋给this时,会将所有字段置零。所以这个方案可以编译通过。

  • 带参构造函数定义之后需要用new显式调用才能执行。否则值类型的字段会保持0或Null值。

     

二 类构造器

  • 类构造器适用于引用类型(包括接口)和值类型,用来设置类的初始状态。类中并没有默认产生的类构造器,需要我们显式构造,标记为static方法。在元数据表中对应.cctor

  • 类构造器只能有一个,不能进行重载。而且不能含参数。类构造器的目的是初始化类的静态成员,它只能访问静态成员,不能访问实例成员。
  • 类构造器的访问限制是私有的,但是我们不能在类构造器前添加访问修饰符,private也不行,否则会产生编译错误,这样做是为了防止开发人员调用该方法。它的调用是由CLR负责的,我们应该避免编写需要以特定顺序调用类构造器的代码。
  • 类构造器不要调用其基类的类构造器。因为基类的静态成员并没有被派生类所继承,它只是编译时静态绑定。
  • 类构造器的调用顺序和实例构造器相似的,首先静态字段被初始化,然后在构造其中被重新赋值。例如:

class Dog : Animal

{

public static string type = "动物";//静态字段

//类构造函数

static Dog()

{

type = "狗狗";

}

}

Console.WriteLine(Dog.type);

 本节小测

Dog的age字段值是什么呢?

A.0             B.5          C.其他

本文转自 陈敬(Cathy) 博客园博客,原文链接:http://www.cnblogs.com/janes/archive/2011/07/22/2113815.html,如需转载请自行联系原作者

跟小静读CLR via C#(06)- 构造器相关推荐

  1. 跟小静读CLR via C#-开篇及目录

    最近正在拜读Jeffrey大师的.NET巨作-<CLR via C#>.好书就像一杯茶,需要静下心来慢慢品.在写笔记的过程中,也加入了自己的思考:在和园友们的交流中,理解也不断的加深. 目 ...

  2. 跟小静读CLR via C#(02)-基元类型、引用类型、值类型

    跟小静读CLR via C#(02)-基元类型.引用类型.值类型 一. 基元类型 编译器能够直接支持的数据类型叫做基元类型.例如int, string等.基元类型和.NET框架类库FCL存在着直接的映 ...

  3. 跟小静读CLR via C#(05)- 访问限定、数据成员

    跟小静读CLR via C#(05)- 访问限定.数据成员 今天跟大家分享一下关于访问限定和数据成员的知识.主要包括以下两点: Abstract, sealed, virtual, new, over ...

  4. 跟小静读CLR via C#(16)--泛型

    泛型就像是一个模板,常常定义一些通用的算法,具体调用时再替换成实际的数据类型,提高了代码的可重用性. 一.初识泛型 1. 简单实例 以最常用的FCL中的泛型List<T >为例: stat ...

  5. 跟小静读CLR via C#(10)-参数

    最近几天学了参数,其实对于参数本不陌生,从上学学C语言基础的时候就学过了.不过细心学下来,还是收获了一些. 一. 命名参数.可选参数 命名参数和可选参数是在Visual C#2010中引入的新特性. ...

  6. 跟小静读CLR via C#(18)——Enum

    1. Enum定义 枚举类型是经常用的一种"名称/值"的形式,例如: public enum FeedbackStatus      {          New,         ...

  7. 跟小静学CLR via C#(12)-委托Delegate

    本来按照进度应该学习事件了,可总觉得应该委托在前,事件在后,才好理解. 委托是一个类,它提供了回调函数机制,而且是类型安全的.使用委托可以将方法当作另一个方法的参数来进行传递,这种将方法动态地赋给参数 ...

  8. 跟小静读《jQuery权威指南》——目录

    前言 2014年开始了,年底给自己制订的学习计划,第一步先从学习<jQuery权威指南>开始. jQuery大家都很比较熟悉,但是我经常是边用的时候边对照着API,这次找本书通读一遍,记录 ...

  9. android百度地图小人头像怎么做,出包女王村雨静-小静-Murasame Oshizu-头像图片-资料介绍-acg人物点评...

    村雨静是动漫<to love>中的登场人物,是四百年前过世的幽灵,进入御门制作的人工身体里转进彩南高中.因为是附身身体,所以经常跌倒,也经常出包的麻烦制造者.一见到最害怕的狗,念力就会失控 ...

最新文章

  1. 个人网站第四次改版了
  2. 贝叶斯定理核心在后验概率是对先验概率的修正,即后验概率是描述来自先验概率的概率
  3. 【美国】谷歌重返机器人背后有何深意?
  4. js data日期初始化的5种方法 [转]
  5. go iscoinbase()_《电车GO!驰骋吧山手线》新情报:高分攻略与新模式介绍
  6. 如何用面对对象来做一个躁动的小球?
  7. mysql 安装盒子_Windows2008 装 MySQL 问题
  8. The Ransom of Red Chief
  9. php实现ftp上传,PHP_PHP实现ftp上传文件示例,FTP上传是PHP实现的一个常见且 - phpStudy...
  10. 使用electron-vue创建项目卡顿的问题
  11. 【Java】利用递归求阶乘
  12. go java websocket_java的连接wss的websocket服务器代码如何转成go代码
  13. 如何理解Spring对缓存的支持
  14. 整人vbs格式小代码
  15. Win10为什么电脑没有本地组策略编辑器
  16. UE4:浅谈什么是GamePlay框架
  17. 神经网络模型入门及蠓虫分类问题简单实战
  18. Prometheus由于时间不同步导致数据不显示
  19. eclipse报错:java.lang.ClassNotFoundException: ContextLoaderListener解决方法
  20. 转:15条优化电脑系统开机速度方法

热门文章

  1. 微信小游戏个人开发者如何盈利
  2. linux 浏览器崩溃,Firefox DoS漏洞导致浏览器崩溃 影响到Windows操作系统
  3. 那年杏花微雨,你说你是BOM
  4. char如何储存那么多汉字
  5. nextTick的理解和作用
  6. 基于Huggingface的预训练语言模型分类体系及实战
  7. 【华为OD机试 2023最新 】 网上商城优惠活动(C++)
  8. TB-RK1808M0最新固件烧录和驱动更新
  9. python循环语句if语句的题目_Python if语句 for语句 while循环的练习
  10. 互联网早报:哈啰科技发布新款助力车“白鸥”、小哈能量站等多款新产品