【傻傻分不清楚】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)堆上。
关于内存分布,准备用一篇文章专门来探讨。
相关文章推荐
- C#中ref和out
- C#DateTime的用法
- C#获取本机IPusing System.Net;
- [C#学习教程-委托]001.大道至简之委托(代理),匿名函数,Lambda表达式
- 【转载】C# 中Session的用法
- 使用VS下载C#API(.NET Framework 类库)
- 【C#】MEF应用
- c# 取 list前100条数据
- c# 基本知识 ref 和 out
- C# 串口调试助手源码
- C# WindowsForm 员工管理系统三【注册】
- C#选择文件夹的实现
- C#读取Modbus数据
- C#中WinForm窗体事件的执行次序如下:
- C# 生成二维码
- CSharpGL(6)在OpenGL中绘制UI元素
- C#知识体系(二)用案例来理解委托与事件
- C# WindowsForm 员工管理系统二【删除】
- 容易忽略的C#设计模式
- 欢迎使用CSDN-markdown编辑器