打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
实例构造器和引用类型(类)——避免代码膨胀
构造器:允许将类型的实例初始化为良好状态的一种特殊方法。所以可以简单的认为构造器就是用于初始化实例。
在说构造器之前,我们简单的看一下创建实例的步骤:
  1.         为实例的数据字段分配内存
  2.         初始化附加字段(类型对象指针和同步块索引)
  3.         调用构造器进行初始化
接下来我们简单的说明一下这一节说明的构造器的几个准则:
  1.         当构造实例时先调用基类
  2.         构造器中一般不调用虚方法


接下来是重点:即当我们调用构造器的时候一定要注意代码膨胀
首先给大家解释一下为什么会代码膨胀:
using System;

namespace clr8_demo1
{
    internal sealed class SomeType
    {
        private Int32 m_x = 5;

        public static void Main()
        { }
    }
}
对于这段非常简单的代码,我们用查看.ctor的IL:
我们可以清楚的看到在.ctor的IL代码中5存储到m_x中,然后调用基类的构造器。
所以我们可以得到这样一个结论:那一句赋值,允许“内联”方式初始化实例字段,即在幕后,这种语法会转换成构造器中的代码来执行初始化。





----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


懂了上面那段话的意思,我们来看个更复杂的代码(其实一点都不复杂):
using System;

namespace clr8_demo1
{
    internal sealed class SomeType
    {
        private Int32 m_x = 5;
        private String m_s = "Hi there";
        private Double m_d = 3.14159;
        private Byte m_b;

        public SomeType() { }
        public SomeType(Int32 x) { }
        public SomeType(String s) { m_d = 10; }
        public static void Main()
        { }
    }
}
对于这段代码我们在看构造器的IL之前应该可以想到在三个构造器中都分别对上面的几句简单的代码进行了初始化操作,这里就是关键,我们随便很简单的几句代码,在后台却进行了三次初始化操作,这就是我们说的代码膨胀:(我们来看下三个IL代码)
这里面分别对m_x,m_s,m_d都进行了存储













这里面同样分别对m_x,m_s,m_d都进行了存储













这里面同样分别对m_x,m_s,m_d都进行了存储













通过这三段IL代码验证了我们之前的猜想,那们该怎么解决呢?通过this指针显示调用构造器
再看一段代码:
using System;

namespace clr8_demo1
{
    internal sealed class SomeType
    {
        private Int32 m_x;
        private String m_s;
        private Double m_d;
        private Byte m_b;

        public SomeType()
        {
            m_x = 5;
            m_s = "Hi there";
            m_d = 3.14159;
            m_b = 0xff;
        }
        public SomeType(Int32 x)
            : this()
        {
            m_x = x;
        }
        public SomeType(String s)
            : this()
        {
            m_s = s;
        }
        public SomeType(Int32 x, String s)
            : this()
        {
            m_x = x;
            m_s = s;
        }
        public static void Main()
        { }
    }
}
我们再来分析一下IL代码:
在.ctor中还依然一样存储在各个字段中,但是我们看一下剩下三个IL代码可以发现一些惊喜(如下):



















从上面三段IL代码可以看到在后台任务减轻,目的达到。

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
内联初始化字段与类实例构造器
Java对象初始化详解
78条高质量编码建议《Effective Java》(1~2)阅读笔记
怎么一本正经地秀技
[你必须知道的.NET] 第六回:深入浅出关键字---base和this
C#泛型编程
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服