引用类型构造器

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

实例对象初始化过程

  • 为实例分配内存;
  • 初始化附加成员,包括方法表指针和SyncBlockIndex变量(我们已经在

    调用顺序

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

    public class Animal{}

    相当于

    public class Animal

    {

    public Animal():base(){}

    }

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

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

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

    class Dog:Animal。。。

    Dog()方法IL代码

    代码爆炸?

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

 class A
{
public int xxxx = ;
public int xxxx2 = ;
public int xxxx3 = ; public A()
{
Console.WriteLine("我是类A的无参构造器");
} public A(string ss)
{
Console.WriteLine("我是类A的无参构造器");
}
} //编译后等价于
class A
{
public int xxxx;
public int xxxx2;
public int xxxx3; public A()
{
xxxx = ;
xxxx2 = ;
xxxx3 = ;
Console.WriteLine("我是类A的无参构造器");
} public A(string ss)
{
xxxx = ;
xxxx2 = ;
xxxx3 = ;
Console.WriteLine("我是类A的无参构造器");
}
} /// <summary>
/// ////////////////////////////////////////////////////////////////////////////////////////////////
/// </summary>
class A
{
public int xxxx = ;
public int xxxx2 = ;
public int xxxx3 = ; public A()
{
Console.WriteLine("我是类A的无参构造器");
} //防止代码爆炸
public A(string ss):this()
{
Console.WriteLine("我是类A的无参构造器");
}
} //编译后等价于
class A
{
public int xxxx;
public int xxxx2;
public int xxxx3; public A()
{
xxxx = ;
xxxx2 = ;
xxxx3 = ;
Console.WriteLine("我是类A的无参构造器");
} public A(string ss):this()
{
Console.WriteLine("我是类A的无参构造器");
}
}

值类型构造器

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

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

    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值。

    

6 CLR实例构造器的更多相关文章

  1. 读经典——《CLR via C#》(Jeffrey Richter著) 笔记_8.1实例构造器和类A

    public class SomeType { } //等价于 public class SomeType { public SomeType():base(){} } [解释]如果定义的类没有显示定 ...

  2. 6 CLR静态构造器

    CLR保证一个类型构造器在每个AppDomain中只执行一次,而且这种执行是线程安全的. 作用: 就是初始化静态成员 比如有几个静态成员需要初始化那你把初始化代码放到哪呢? 放到普通构造函数里,那肯定 ...

  3. Sql Server 2005 CLR实例

    本文转载:http://www.cnblogs.com/yongfa365/archive/2010/04/26/SQL-Server-CLR.html CSDN:博客参考http://blog.cs ...

  4. CLR via C#(06)- 构造器

    最近忙着看新还珠,好几天不学习了.玩物丧志啊,罪过罪过. 今天总结的是类构造器的知识,其实这方面的文章蛮多的,可还是觉得亲自写一下对自己的思考和认识会有提高. 对于构造器,大家应该都不陌生,它主要是用 ...

  5. CLR类型设计之方法与构造器

    无论学习那门语言都要学习函数体,C#,JAVA,PHP,都会涉及到函数体,而C#的函数体成员并不少,方法和构造器就是函数体成员之一,函数体成员还包括但不限于:方法,属性,构造器,终结器,运算符及索引器 ...

  6. 类型基础---CLR Via C#笔记一

    一.所有类型都是从System.Obejct派生 1.下面两个类型定义是完全一致的: class Employee{ ... } class Employee:System.Object{ ... } ...

  7. 《CLR.via.C#第三版》第二部分第8,9章节读书笔记(四)

    三种类型的构造方法: 实例构造器(引用类型):实例构造器永远不能被继承(所以方法前没有修饰符):如果类的修饰符为static(sealed和abstract),编译器根本不会在类的定义中生成一个默认构 ...

  8. CLR via C# 读书笔记---常量、字段、方法和参数

    常量 常量是值从不变化的符号.定义常量符号时,它的值必须能在编译时确定.确定后,编译器将唱两只保存在程序集元数据中.使用const关键字声明常量.由于常量值从不变化,所以常量总是被视为类型定义的一部分 ...

  9. C#知识点总结系列:5、CLR的组成和运转

    clr基本 CLR(Common Language Runtime)是一个可由多种编程语言使用的“运行时”.(例如:c#,c++/cli,vb,f#,ironpython,ironruby,il... ...

随机推荐

  1. Web App 和 Native App,哪个是趋势?

    一.Web App vs. Native App 比起手机App,网站有一些明显的优点. 跨平台:所有系统都能运行 免安装:打开浏览器,就能使用 快速部署:升级只需在服务器更新代码 超链接:可以与其他 ...

  2. asp.net 用JWT来实现token以此取代Session

    先说一下为什么要写这一篇博客吧,其实个人有关asp.net 会话管理的了解也就一般,这里写出来主要是请大家帮我分析分析这个思路是否正确.我以前有些有关Session的也整理如下: 你的项目真的需要Se ...

  3. Tkinter(2.x 与3.X的区别)

    1.包的引入 2.X下是 from Tkinter import * 而3.x是 from tkinter import * 否则,会报找不到tkinter的错误 Traceback (most re ...

  4. 你还记得当初为什么进入IT行业吗?

    说到这个问题,小编相信不少童鞋开始忆往昔峥嵘岁月,那个少年为了心中的改变世界的理想,进入了这个行业,但是呢,有一群人画风就不一样了,他们进入IT行业,完全只是是因为.... 小时候广告看多了....: ...

  5. android下使用tcpdump抓包

    tcpdump是linux下的抓包工具,在android中没有,需要下载对应的工具. 下载地址:https://www.androidtcpdump.com/android-tcpdump/downl ...

  6. 11款CSS3动画工具的开发

    本文展示了11个最好的和最令人惊异的CSS3动画工具,将为开发者是非常有帮助的.CSS3有设计师和开发人员之间的良好的声誉.它是在这里帮助他们创造惊人的结果. 有了这些动画工具,你可以创造一个轻松自由 ...

  7. AI金融知识自学偏量化方向-前提1

    前提: 统计学习(统计分析)和机器学习之间的区别 金融公司采用机器学习技术及招募相关人才要求 第一个问题:  机器学习和统计学都是数据科学的一部分.机器学习中的学习一词表示算法依赖于一些数据(被用作训 ...

  8. java 虚拟机设置 Xms Xmx PermSize MaxPermSize

    Eclipse崩溃,错误提示:MyEclipse has detected that less than 5% of the 64MB of Perm Gen (Non-heap memory) sp ...

  9. Retrieve id of record just inserted into a Java DB (Derby) database

    https://stackoverflow.com/questions/4894754/retrieve-id-of-record-just-inserted-into-a-java-db-derby ...

  10. HttpWebRequest - Asynchronous Programming Model/Task.Factory.FromAsyc

    Posted by Shiv Kumar on 23rd February, 2011 The Asynchronous Programming Model (or APM) has been aro ...