ASP.NET框架设计(三)-----类型()

  ASP.NET所有类型都是从System.Object类型派生,因此在System.Object将为每个类型提供一些公共方法。

Equals

比较两个对象,如果相同返回ture

GetHashCode

返回对象的一个哈希值

ToString

默认情况,该方法返回类型的完整名称,即this.GetType().FullName。但是这个方法常常被重写,使其返回一个字符串对象。

GetType

返回由Type派生对象实例,是一个非虚方法。

除此之外Object派生类可以访问MemberwiseCloneFinalize这两个受保护方法。MemberwiseClone方法能够创建一个新的实例,并将新对象实例个字段设置成于this对象实例完全一致。Finalize方法对象的内存被回收之前会被调用,如过在内存被回收之前执行一些其它操作可以可以重写这个方法。

CLR要求对象使用new操作符来创建,即(Test x=new Test())。new将计算Test类型及其基类型中定义字段所需要的字节数(包括类型对象指针与同步块索引),然后从托管堆中分配指定类型所需的字节数,从而分配对象的内存。

由上可知想要知道一个对象的类型,可以调用GetType方法。对于开发人员而言,经常需要把对象从一种类型转换成其他类型。C#可以将一个对象隐式地强制转换成它的任何基类型,但是C#要求开发人员将一个对象显式转换成它的派生类型。

C#中可以使用isas操作符来进行强制类型转换。使用is返回的是一个Boolean值,对于兼容的类型可以转换返回ture,否则false。使用as操作符,如果类型兼容可以转换则返回对同一个对象的一个非null引用,否则返回null。值得注意的是两个操作符都不会抛出异常。

 

基元类型

由于一些类型非常的常用,以致许多编译器提供简化的描述方法。如:

System.Int32 x = new System.Int32();          int x = 0;

表示的是同一个意思。我们把编译器直接支持数据类型都称作基元类型。基元类型直接映射到FCL中的类型。这相当于在所有代码前添加

using int = System.Int32;

C#基元类型有:

sbyte byte short ushort int uint long ulong char float double bool decimal object string

 

对于基元类型常常会在许多算术运算中造成溢出。对于溢出有些编程语言视为错误,而有些却不。对与程序员而言大多情况下不是很希望一些不报错的溢出,然而在有些情况下我们希望溢出。C#允许编程人员字节决定如何处理溢出。通过使用checked和unchecked来控制对溢出的操作,但在默认情况下并不检查溢出情况。

 

引用类型与值类型

在CLR中类型可以被分为两类:值类型和引用类型。其中大部分类型都是引用类型,但用得最多的是值类型。引用类型是从托管堆上分配的,当new操作符会返回对象的内存地址。因此使用引用类型会涉及一些性能问题。所以为了提升常用类型的性能,CLR提出了值类型这种轻量级类型(值类型的实例通常是在一个线程堆栈上分配)。在C#中值类型都是由System.ValueType这个抽象类中派生的。

 

值类型的装箱(boxing)和拆箱(unboxing)

装箱是将一个值类型转换成一个引用类型的机制。装箱机制首先在托管堆中分配好内存(内存大小是值类型各字段总内存与类型对象指针、同步块索引之和),然后把值类型的字段复制到新分配的内存中,最后返回对象的地址。

同理拆箱就是把装箱好的值类型还原。拆箱其实是获取一个指针的过程,该指针指向包含在一个对象中的原始值类型。

我们来看下面一个例子:

static void Main(string[] args)

        {

            Int32 x = 100;    //创建一个Int32值

            Object o = x;     //第一次装箱

            x = 200;          //未装箱的x改为200

            Console.WriteLine(x + " " + (Int32)o); 

//x进行第二次装箱,(Int32)o进行第三次装箱

 }

 

装箱/拆箱会对性能造成影响(影响程序运行速度与内存消耗)。因此我们在程序设计中应该尽量避免一些没有必要的装箱/拆箱操作,以提高性能。

posted on 2009-11-30 15:24  pcxpt.exe  阅读(798)  评论(0编辑  收藏  举报