C#类型理解

  C#类型主要分为两类:值类型和引用类型。C#主要类型如下:

类别

描述

值类型

简单类型

有符号整形:sbyte,short,int,long

无符号整形:byte,ushort,uint,ulong

Unicode字符:char

IEEE浮点型:float,double

高精度小数:decimal

布尔型:bool

枚举类型

用户自定义类型:enum

结构类型

用户自定义类型:struct

引用类型

类类型

所有其他类型基类:object

Unicode字符串:string

用户自定义类型:class

接口类型

用户自定义类型:interface

数组类型

单维多维数组:int[],int[,]

委托类型

用户自定义类型:delegate

  C#值类型和引用类型的区别:

  1、定义:值类型(Value Type)实例通常分配在线程的堆栈(stack)上,不包含任何指向实例数据的指针,变量本身就包含了实例数据。值类型的实例要么在堆栈上,要么内联在结构上。值类型包括:简单类型,结构体类型和枚举类型。

  引用类型(Reference Type)实例分配在托管堆(managed heap)上,变量保存了实例数据的内存引用。引用类型存储对值的内存地址的引用,位于堆上。引用类型包括:类类型,数组,委托类型和接口类型。

  2、内存概况:值类型分配在堆栈上,每实例一个值类型则在堆栈上分配一个内存地址,不同的变量占用了不同的堆栈地址,改变一个变量不会影响其他变量。

  引用类型在堆栈中只是保存了其实例数据的引用地址,实际的数据保存在托管堆中,所以可能不同的变量保存了同一地址的数据引用,改变一个变量会影响另一个变量的值。

  3、嵌套结构:引用类型嵌套值类型时,作为引用类型实例的一部分也会被分配到托管堆上。

  值类型嵌套引用类型时,引用类型作为值类型的成员变量,堆栈上保存该成员的引用,而成员的实际数据还是保存在托管堆上。即值类型实例总是分配在它声明的地方,声明为局部变量时内存被分配在堆栈上,声明为引用类型成员变量时内存被分配到托管堆上;引用类型总是分配在托管堆上。

  4、值类型继承自ValueType,引用类型继承于object。

  5、值类型的内存不由GC控制,作用域结束时,值类型会自动释放,减少托管堆的压力,具有性能优势。而引用类型的内存分配与回收都由GC来完成。

  6、值类型时密封的,不能作为基类,但可以单继承或者多继承接口。引用类型一般可以继承。

  7、值类型不具有多态,引用类型具有多态。

  8、值类型不能为null,会自动初始化为0;引用类型默认初始化为null,表示没有指向任何托管堆的引用地址。

  9、值类型由2种状态:装箱和未装箱;引用类型只有一种形式:装箱。

posted on 2010-10-28 15:16  paulma  阅读(914)  评论(0编辑  收藏  举报