实例构造器和类(引用类型)


构造器是允许将类型的实例初始化为良好状态的一种特殊方法。构造器方法在“方法定义元数据表”中始终教.ctor。
创建一个引用类型的实例时,首先为实例的数据字段分配内存,然后初始化对象的附加字段(类型对象指针呵呵同步块索引),最后调用类型的实例构造器来设置对象的初始状态。
实例构造器永远不能被继承。
如果类的修饰符为abstract,那么编译器生成的默认构造器的可访问性就为protected;否则,构造器会被赋予public可访问性。如果基类没有提供无参数构造器,那么派生类必须显示调用一个基类构造器,否则编译器会报错。如果类的修饰符为static(sealed和abstract),编译器根本不会再类的定义中生成一个默认构造器。
C#编译器提供一个简化的语法,允许以“内联”方式初始化实例字段。但在幕后,它会将这种语法转换成构造器方法中的代码来执行初始化。这同时提醒我们注意代码的膨胀效应。
所谓内联,是指在代码中直接赋值来初始,而不是通过构造器。
    internal sealed class SomeType
    {
        public SomeType() { }
        public SomeType(Int32 x) { }
        public SomeType(String s) { }

        private Int32 m_x = 5;
        private String m_s = "Hello World";
        private Double m_d = 3.14159;
        private Byte m_b;
    }
编译器为这三个构造器方法生成代码时,在每个方法开始的位置,都会包含用于初始化m_x,m_s和m_d的代码。在这些初始化代码之后,编译器会插入对基类构造器的调用。再然后,会插入构造器自己的代码。查看该类的IL代码,发现有三个构造方法:
 kPBM0bjnHVuvkAAAAASUVORK5CYII=
每个.ctor方法中都会初始化m_x,m_s和m_d。如下IL代码(这里只是贴出了无参数构造器的IL代码):
.method public hidebysig specialname rtspecialname
        instance void  .ctor() cil managed
{
  // 代码大小       43 (0x2b)
  .maxstack  8
  IL_0000:  ldarg.0
  IL_0001:  ldc.i4.5
  IL_0002:  stfld      int32 ctor.SomeType::m_x
  IL_0007:  ldarg.0
  IL_0008:  ldstr      "Hello World"
  IL_000d:  stfld      string ctor.SomeType::m_s
  IL_0012:  ldarg.0
  IL_0013:  ldc.r8     3.1415899999999999
  IL_001c:  stfld      float64 ctor.SomeType::m_d
  IL_0021:  ldarg.0
  IL_0022:  call       instance void [mscorlib]System.Object::.ctor()
  IL_0027:  nop
  IL_0028:  nop
  IL_0029:  nop
  IL_002a:  ret
} // end of method SomeType::.ctor
如果有几个以初始化的实例字段和大量重载的构造器方法,可考虑不是在定义字段时初始化,而是创建单个构造器来执行这些公共的初始化。然后,让其他构造器显示调用这个公共初始化构造器。这样可以减少生成的代码。如下演示:
        public SomeType1()
        {
            m_x = 5;
            m_s = "Hello World";
            m_d = 3.14159;
            m_b = 0xff;
        }
        public SomeType1(Int32 x)
            : this()
        {
            m_x = x;
        }
        public SomeType1(String s)
            : this()
        {
            m_s = s;
        }
        public SomeType1(Int32 x, String s)
            : this()
        {
            m_s = s;
            m_x = x;
        }
    }
编译后,会发现无参数的构造函数IL代码与上面的IL一样,而在SomeType1(Int32 x)中的IL代码中如下:
.method public hidebysig specialname rtspecialname
        instance void  .ctor(int32 x) cil managed
{
  // 代码大小       17 (0x11)
  .maxstack  8
  IL_0000:  ldarg.0
  IL_0001:  call       instance void ctor.SomeType1::.ctor()
  IL_0006:  nop
  IL_0007:  nop
  IL_0008:  ldarg.0
  IL_0009:  ldarg.1
  IL_000a:  stfld      int32 ctor.SomeType1::m_x
  IL_000f:  nop
  IL_0010:  ret
} // end of method SomeType1::.ctor
在该构造器中先调用无参数的构造器(如上红色),然后再进行本身构造器的实例化。
由此可见,这样很好的防止了代码膨胀。

转载于:https://www.cnblogs.com/rayxin/archive/2011/05/17/2049123.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/261422.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

android 文件选择器_Android 开发 打开系统文件、图片、视频等 实现单选多选功能...

在网上搜下,如何实现图片的多选或者文件的多选,令人纳闷的是居然多是moudle、或第三方jar包,当然第三方的工程功能复杂或兼容性比较好,并没有说明Android系统是如何提供多选的。既然这么多图片选择器的工程、或者是文件选择器的工…

C语言错误: HEAP CORRUPTION DETECTED

程序源代码&#xff1a; //写文件两种方式(文本文件和二进制文件)#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #include<string.h>//文本写文件 int writeWord(const char *path,const char *pword){int ERRO_MSG 0;if (path N…

您不能不知的ToString()方法

1.1.1 摘要 相信大家对ToString()方法再熟悉不过了&#xff0c;由于该方法是.NET程序中最常用的方法之一&#xff0c;我们除了可以直接调用ToString()方法之外&#xff0c;.NET中的某些方法也隐式调用ToString()方法&#xff08;WPF&#xff0c;Windows Form和Silverlight等&am…

微信转账一次显示两个_微信为啥分红包和转账两大功能?这4个区别你要知道,望相互转告...

众所周知&#xff0c;自从移动支付普及之后&#xff0c;支付宝、微信就已经成为人们手机中必备的APP&#xff0c;其中微信更是具备社交、支付等一系列功能&#xff0c;所以在国内吸引了超十一亿用户的使用&#xff01;当我们节假日、过年时&#xff0c;很多用户都喜欢给亲朋好友…

java 正则提取及替换字符串

2019独角兽企业重金招聘Python工程师标准>>> <% page import"java.util.regex.Pattern" %><% page import"java.util.regex.Matcher" %><% page import"java.util.List" %><% page import"java.util.Array…

IE的documentMode属性

参看下面链接:《IE的documentModeshuxing》 转载于:https://www.cnblogs.com/chaoguo1234/p/3192865.html

Android传感器编程入门

一、前言 我很喜欢电脑&#xff0c;可是笔记本还是太大&#xff0c;笔记本电脑再小还是要弄个小包背起来的&#xff0c;智能手机则不同&#xff0c;它完全就是一个手机&#xff0c;可以随意装在一个口袋里随身携带。因此我在2002年左右时最喜欢玩装备是Dell的PDA&#xff0c;20…

python引入redis_使用python向Redis批量导入数据

1.使用pipeline进行批量导入数据class Redis_Handler(Handler):def connect(self):#print self.host,self.port,self.tableself.conn Connection(self.host,self.port,self.table)def execute(self, action_name):filename "/tmp/temp.txt"batch_size 10000with o…

使用R语言绘制中国地图

R语言环境 R3.1.1 Windows8.1 需要安装的packages: maptools,gp 绘图所需要的数据 中国地图的GIS数据 &#xff08;可以此下面的网址下载) http://cos.name/wp-content/uploads/2009/07/chinaprovinceborderdata_tar_gz.zip 是一个压缩包&#xff0c;完全解压后包含三个文件&am…

ASP.NET MVC 5 学习教程:控制器传递数据给视图

起飞网 ASP.NET MVC 5 学习教程目录&#xff1a; 添加控制器添加视图修改视图和布局页控制器传递数据给视图添加模型创建连接字符串通过控制器访问模型的数据生成的代码详解使用 SQL Server LocalDBEdit方法和Edit视图详解添加查询Entity Framework 数据迁移之添加字段添加验证…

如何将ListT转换相应的Html(xsl动态转换)(二)

一、前言 紧跟着上一篇随笔&#xff0c;本文主要涉及到如何将xml与xsl动态转换成html&#xff0c;这个才是最关键的地方&#xff0c;所有的内容都是围绕这个主题来进行开展的。根据指定的xsl样式将List<T>转换相应的Html&#xff0c;相关的随笔如下&#xff1a; &#xf…

echarts折线图背景线_echarts设置折线线条颜色和折线点颜色的实例

本文主要介绍了jQuery插件echarts设置折线图中折线线条颜色和折线点颜色的方法,结合实例形式分析了jQuery图表插件echarts设置折线图的相关操作技巧,需要的朋友可以参考下&#xff0c;希望能帮助到大家。1、问题背景设计一条折线图&#xff0c;但是图形中不用插件自带的颜色&am…

saxbuilder用法(转)

xml为我们在网络交换数据带来很大方便,在java中可以使用saxbuilder来操作xml格式文件,下面介绍一下saxbuilder的常用方法.import org.jdom.Document;import org.jdom.Element;import org.jdom.JDOMException;import org.jdom.input.SAXBuilder;import org.jdom.output.XMLOutpu…

页面添加复制代码功能

简单的"复制代码" 功能<a href"javascript:" οnclick"CopyCode(document.getElementById(code1));">复制代码</a> <div id"code1"> 点击复制 这里放代码这里放代码这里放代码这里放代码这里放代码这里放代码这里放…

Linux CentOS 5.5 服务器安装图文教程

下面开始&#xff1a; 系统版本&#xff1a;CentOS 5.5 将镜像刻成光盘&#xff0c;设置BIOS将CDROM设置为第一启动 启动画面&#xff1a; 通过提示&#xff0c;按ENTER进入图形安装模式&#xff08;E文不好的&#xff0c;赶紧补习去哈~~~&#xff09; 我们按ENTER键 信息检测&…

win10大文件无法移动到U盘

想着把自己的一些文件整理整理&#xff0c;发现稍微大点的文件竟然不能copy到U盘&#xff0c;百度了一番&#xff08;不好意思&#xff0c;最近百度犯错查的正狠^_^&#xff09;,发现因为U盘的格式不是NTFS,只要把U盘格式改为NTFS就可以copy大文件了。 方法一&#xff1a;用命令…

为多孔介质的当量直径_新型纳米多孔碳材料在催化剂载体方面的应用

成分&#xff1a;基本成分为碳91-95%&#xff0c;氧4-8%&#xff0c;氢1%&#xff0c;具有良好的导电性&#xff08;2-10 S/cm&#xff09;和优良的化学稳定性。 结构&#xff1a;内部是三维贯通的纳米孔道结构&#xff0c;每个孔与周围12个孔相连&#xff0c;孔道结构有序&…

Shell 变量的操作方法

在Shell中&#xff0c;经常会用到:和:-这样的操作符。 这两个操作符功能很相似&#xff0c;下面简单比较下: #color"red" echo "color is ${color}" //这样应该会打印color is (空白)稍微改造下: echo "color is ${color:-"no color"}"…

maven-settings.xml的那些事

1、代理<proxies> <proxies><proxy><id>optional</id>//代理名<active>true</active>//true激活该代理<protocol>http</protocol>//代理协议<username>proxyuser</username>//帐号密码<password>prox…

替换空格

题目描述&#xff1a; 请实现一个函数&#xff0c;将一个字符串中的空格替换成“%20”。例如&#xff0c;当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。 时间复杂度o(n)的算法 先遍历一次字符串统计出空格的总数&#xff0c;计算出替换之后的字符串的总长…