首页 > 其他 > 详细

类型基础

时间:2017-04-04 21:27:35      阅读:227      评论:0      收藏:0      [点我收藏+]

类型概述

类型是CLR程序的生成块(building block).

CLR类型(CLR type)是命名的可重用抽象体.

CLR类型定义由零个或多个成员(member)组成.类型的成员控制类型如何使用.以及类型如何工作.类型的每个成员都有自己的访问修饰符(access modifier)控制对于成员的访问.类型的可访问成员会被经常引用,组合在一起就是类型的合同(contract).

除了控制对给定成员的访问,开发人员还能够控制类型的实例是否需要访问该成员.多数成员能被定义为按实例(per instance)按类型(per type)访问.按实例访问成员(per-instance member)需要通过这个类型的实例才能访问.按类型访问成员(per-type member)则没有这种要求.

CTS有三种基本类型的成员:字段,方法嵌套类型.字段是一个命名的存储单元,它隶属于所声明的类型.方法是一个命名的操作,它可以被调用和执行.嵌套类型则是一种简单的辅助类型,它被定义为声明类型的实现的一部分.其他类型成员(例如:属性,事件)是以附加元数据的形式出现的方法(属性和事件实际上也是方法).

类型的字段控制内存如何分配.CLR使用类型的字段来决定分配多少内存给这个类型.CLR会给static字段分配一次内存:即在类型被首次加载的时候.CLR在每次分配类型实例时,都会为non-static(instance)[非静态(实例)]字段分配内存.在分配内存时,CLR初始化所有的static字段,并且为它们赋予默认值.对于数值类型,默认值是零,对于布尔类型,默认值是false.对于对象引用,默认值是null.CLR也会初始化堆分配的(heap-allocated)实例字段,同样赋予上述默认值.

CLR保证static字段和堆分配(heap-allocated)实例字段的初始化状态.CLR将把局部变量分配在堆栈中.

就customerCount来说,类型被首次使用之前内存会分配和初始化.对于其他字段,每当新的AcmCorp.LOB实例被分配在堆上时,内存都会被分配和初始化.

技术分享

技术分享

默认情况下,确切的内存布局是不透明的.CLR将使用虚拟的内存布局,并且经常会重新排序字段以优化访问和使用,如图3.1所示.注意,声明的顺序是:isGoodCustomer,lastName,banlance,extra和firstInitial.如果CLR以类型声明的顺序布局字段,它将不得不在字段间插入空间量(padding),以避免对个别字段的不对齐访问--这将会影响性能.为了避免这点,CLR对字段重新排序以便不再有不必要的空间量.因此,在作者的32位IA-32机器上,这意味着最终采用的顺序是:balance,lastName,firstInitial,isGoodCustomer和extra.这种布局的结果是取消不必要的空间量,并能很好地对齐数据.然而,CLR确切的布局策略并没有正式的文档,并且,对于不同版本的CLR也不可能只依赖某一种特定的策略.

CLR提供了两种将字段声明为常量值的方式.第一种方式所适用的字段,它的常量值是在编译时计算的--这是效率最高的:字段的静态值仅仅作为一个字面值存储在类型的元数据模块中,在运行时它并不是一个真正的字段.准确地说,编译器需要内联任何到字面字段的访问,从本质上讲,它是将字面值嵌入到指令流中.在C#中声明字面字段,必须使用const关键字.这还需要一个初始化表达式,使得它的值能够在编译时计算出来.

技术分享

任何试图修改这个字段的做法都将作为编译时错误被捕获

对于第二种方式,CLR允许程序员将字段声明为不变的(immutable),它将一个字段声明为initonly,并动态地初始化.如果将initonly特性应用到一个字段,那么,一旦构造函数执行完毕,就不允许再对字段值修改.在C#种要指定一个initonly字段,就必须使用readonly关键字.

技术分享

注意,这段代码动态地生成了created字段的初始化值,它是基于当前时间的.也就是说,在新的实例构造函数执行完毕后,假如created的值被设置,就不能再改变它

类型和初始化

 

类型基础

原文:http://www.cnblogs.com/revoid/p/6666482.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!