日期:2014-05-17  浏览次数:20973 次

c# 引用类型和值类型区别
值类型包括C#的基本类型(用关键字int、char、float等来声明),结构(用struct关键字声明的类型),枚举(用enum关键字声明的类型);而引用类型包括类(用class关键字声明的类型)和委托(用delegate关键字声明的特殊类)。

C#中的每一种类型要么是值类型,要么是引用类型。所以每个对象要么是值类型的实例,要么是引用类型的实例。值类型的实例通常是在线程栈上分配的(静态分配),但是在某些情形下可以存储在堆中。引用类型的对象总是在进程堆中分配(动态分配)。

System.Object和System.ValueType

引用类型和值类型都继承自System.Object类。不同的是,几乎所有的引用类型都直接从System.Object继承,而值类型则继承其子类,即直接继承System.ValueType。作为所有类型的基类,System.Object提供了一组方法,这些方法在所有类型中都能找到。其中包含 toString方法及clone等方法。System.ValueType继承System.Object。它没有添加任何成员,但覆盖了所继承的一些方法,使其更适合于值类型。

值类型
C#的所有值类型均隐式派生自System.ValueType:

结构体:struct(直接派生于System.ValueType)。

数值类型:整型,sbyte(System.SByte的别名),short(System.Int16),int(System.Int32),long(System.Int64),byte(System.Byte),ushort(System.UInt16),uint(System.UInt32),ulong(System.UInt64),char(System.Char)。

浮点型:float(System.Single),double(System.Double)。

用于财务计算的高精度decimal型:decimal(System.Decimal)。

bool型:bool(System.Boolean的别名)。

用户定义的结构体(派生于System.ValueType)。

枚举:enum(派生于System.Enum)。

可空类型。

每种值类型均有一个隐式的默认构造函数来初始化该类型的默认值。例如:

int i = 0;

等价于:

int i = new int();

使用new运算符时,将调用特定类型的默认构造函数并对变量赋予默认值。在上例中,默认构造函数将值0赋给了i。

引用类型

数组(派生于System.Array)

类:class(派生于System.Object);

接口:interface(接口不是一个“东西”,所以不存在派生于何处的问题。接口只是表示一种contract约定[contract])。

委托:delegate(派生于System.Delegate)。

object(System.Object的别名);

字符串:string(System.String的别名)。

值类型和引用类型的区别?

1.赋值方式不同:基于值类型的变量直接包含值。将一个值类型变量赋给另一个值类型变量时,将复制包含的值。引用类型变量的赋值只复制对对象的引用,而不复制对象本身。
2.值类型不可能派生出新的类型:所有的值类型均隐式派生自 System.ValueType。但与引用类型相同的是,结构也可以实现接口。
3.值类型不可能包含 null 值:然而,可空类型功能允许将 null 赋给值类型。
4.每种值类型均有一个隐式的默认构造函数来初始化该类型的默认值。


1、这个类型分配在哪里?
值类型:分配在栈上
引用类型:分配在托管堆上
2、基类型是什么?
值类型:必须继承自System.ValueType可以继承自除了System.ValueType以外的任何类型,只要那个类型不是sealed(密封)的
3、这个类型能作为其他类型的基类吗?
值类型:不能。值类型是密封的,不能被继承
引用类型:是的。如果这个类型不是密封的,它可以作为其他类型的基类
4、默认的参数传递是什么?
值类型:变量是按值传递的(也就是,一个变量的副本被传入被调用的函数)变量是按引用传递(例如,变量的地址传入被调用的函数)
5、我可以为这个类型定义构造函数吗?
值类型:是的,但是默认的构造函数被保留(也就是自定义构造函数必须全部带有参数)
引用类型:当然!
6、这个类型的变量什么时候消亡?
值类型:当它们越出定义的作用域时。
引用类型:当托管堆被垃圾回收时。
引用类型:
引用类型: