您的位置:首页 > 编程语言 > C#

【傻傻分不清楚】C#值类型、引用类型

2015-09-25 10:03 330 查看

1.包含的数据类型



1.1值类型

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);
可空类型(派生于System.Nullable<T>泛型结构体,T?实际上是System.Nullable<T>的别名)。

值类型实例通常分配在线程的堆栈(stack)上,并且不包含任何指向实例数据的指针,因为变量本身就包含了其实例数据。

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

所有的值类型都是密封(seal)的,所以无法派生出新的值类型。

可以用Type.IsValueType属性来判断一个类型是否为值类型:

TestType testType = new TestType ();
if (testTypetype.GetType().IsValueType)
{
Console.WriteLine("{0} is value type.", testType.ToString());
}


1.2引用类型

引用类型继承System.Object

数组(派生于System.Array)
用户用定义的以下类型:

类:class(派生于System.Object);
接口:interface(接口不是一个“东西”,所以不存在派生于何处的问题。Anders在《C# Programming Language》中说,接口只是表示一种约定[contract]);
委托:delegate(派生于System.Delegate)。

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

1.3在数据类型的区别

引用类型可以派生出新的类型,而值类型不能;
引用类型可以包含null值,值类型不能(可空类型功能允许将 null 赋给值类型);
引用类型变量的赋值只复制对对象的引用,而不复制对象本身。而将一个值类型变量赋给另一个值类型变量时,将复制包含的值

2.内存分配区别

值类型变量做为局部变量时,该实例将被创建在堆栈上;而如果值类型变量作为类型的成员变量时,它将作为类型实例数据的一部分,同该类型的其他字段都保存在托管堆上,将在接下来的嵌套结构部分来详细说明问题。

引用类型变量数据保存在托管堆上,但是根据实例的大小有所区别,如下:如果实例的大小小于85000Byte时,则该实例将创建在GC堆上;而当实例大小大于等于85000byte时,则该实例创建在LOH(Large Object Heap)堆上。

关于内存分布,准备用一篇文章专门来探讨。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: