《CLR via C#》第8章方法的一些笔记

实例构造器

1、如果类的修饰符为abstract,编译器默认生成的构造器就是protexted
2、如果类为static,则编译器不会再类的定义中生成默认构造器。

static class StaticClassTest
{
    public static int a;
}
class NoStaticClassTest
{
    public  int a;
}

上面一个是静态类,下面则是非静态类,使用ILDasm工具看一下中间代码可以有更加清楚的认识。

在这里插入图片描述
在这里插入图片描述
可以清楚地看到非静态类会生成一个默认构造器,点开看一下

在这里插入图片描述
如果派生类的构造器没有显示调用一个基类构造器。编译器会自动生成对默认的基类构造器的调用,最终会调用到System.Object的公共无参构造器,由于System.Object没有定义实例字段,所以该构造器什么也不做直接返回。

如果在构造引用类型实例时初始化类型中定义的字段。那么编译器会以“内联”的形式初始化实例字段。观察IL代码会发现

class NoStaticClassTest
{
    public  int a=5;
}

在这里插入图片描述
NoStaticClassTest的构造器会先把值5存到字段a,再调用基类的构造器。可以考虑不要在定义字段的时候进行初始化,而是创建单个构造器来执行这些初始化,这样可以减少生成的代码。

例如:

class MyClass
{
    private string my = "fff";
    private double mz = 5.888;
    public MyClass()
    {
        my = "ssss";
        mz = 3.145;
    }
    public MyClass(Int32 x)
    {

    }
    public MyClass(string s)
    {
        mz = 10;
    }
}

对应无参构造器的IL代码

在这里插入图片描述
修改代码,使其不要显示初始化字段

class MyType
{
    private string my ;
    private double mz;
    public MyType()
    {
        my = "ssss";
        mz = 3.145;
    }
    public MyType(double x):this()
    {
        mz= x;
    }
    public MyType(string s) : this()
    {
        my =s;
    }
}

对应无参构造器的IL代码

在这里插入图片描述


之前说的都是引用类型,接下来看一下值类型

C#编译器不会为值类型内嵌默认的无参构造器,但是允许为值类型显式定义构造器,并且要注意以下几点:
1、不能显示定义无参数构造器
2、不能内联实例字段的初始化
3、在定义的构造器中必须为所有的字段进行赋值。

类型构造器

类型构造器也称为静态构造器,只执行一次,定义也只能定义一个,类型构造器总是私有,并且永远没有参数,因为对于他的调用是由CLR执行的。

class NoStaticClassTest
{
    public static int a=55;
}

生成上述代码时,编译器会自动生成一个类型构造器,查看IL代码可以看出

在这里插入图片描述
会多出一个**.cctor**的方法,就是类型构造器。

在这里插入图片描述
.cctor 方法总是默认 privatestatic 的。

 class NoStaticClassTest
 {
     public static int a = 55;
     static NoStaticClassTest(){
         a=60;
      }
 }

如果是上述代码,编译器也只是生成一个类型构造器,先将a初始化为55,再修改成60。

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值