值类型
- 值类型变量可以直接分配给一个值.它们是从类System.ValueType中派生的.
- 值类型直接存储其值
- 值类型的实例通常是在线程栈上分配的(静态分配),但是在某些情形下可以存储在堆中
- 值类型总是分配在它声明的地方:作为字段时,跟随其所属的变量(实例)存储:作为局部变量时,存储在栈上.栈的内存是自动释放的.
- 值类型在内存管理方法具有更好的效率,并且不支持多态,适合用做存储数据的载体
- C#的值类型包括:结构体(数据类型,bool型,用户定义的结构体),枚举,可空类型
类型 | 描述 | 范围 | 默认值 |
---|---|---|---|
bool | 布尔值 | True或False | False |
char | 16位Unicode字符 | U+0000到U+fff | ‘’ |
byte | 8 位无符号整数 | 0 到 255 | 0 |
sbyte | 8 位有符号整数 | -128 到 127 | 0 |
short | 16 位有符号整数 | -32,768 到 32,767 | 0 |
ushort | 16 位无符号整数 | 0 到 65,535 | 0 |
int | 32 位有符号整数 | -2,147,483,648 到 2,147,483,647 | 0 |
uint | 32 位无符号整数 | 0 到 4,294,967,295 | 0 |
long | 64 位有符号整数 | -923,372,036,854,775,808 到 9,23,372,036,854,775,807 | 0 |
ulong | 64 位无符号整数 | 0 到 18,446,744,073,709,551,615 | 0 |
float | 32 位单精度浮点 | -3.4 x 1038 到 + 3.4 x 1038 | 0.0F |
double | 64 位双精度浮点 | (+/-)5.0 x 10-324 到 (+/-)1.7 x 10308 | 0.0 |
decimal | 128 位精确的十进制值,28-29 有效位数 | (-7.9 x 1028 到 7.9 x 1028) / 100 到 28 | 0.0M |
引用类型(Reference types)
- 引用类型不包含存储在变量中的实际数据,但它们包含对变量的引用.继承自System.Object类
- 引用类型存储对其值的引用.它们指的是一个内存位置.使用多个变量时,引用类型可以指向一个内存位置.如果内存位置的数据是由一个变量改变的,其他变量会自动反映这种值得变化
- 引用类型当声明一个类时,只在栈中分配一小片内存用于容纳一个地址,而此时并没有为其分配堆上的内存空间.当使用new创建一个类的实例时,分配堆上的空间,并把堆上空间的地址保存到栈上分配的小片空间中.
- 引用类型的对象宗师在进程堆中分配(动态分配)
- 引用类型在栈中存储一个引用,其实际的存储位置位于托管堆.简称引用类型部署在托管堆上(堆内存是.NET中会由GC来自动释放)
- 引用类型可以派生出新的类型,而值类型不能,因为所有的值类型都是密封(seal)的
- 引用类型可以包含null值,值类型不能(可空类型功能允许将null赋给值类型,如int?a=null)
- 引用类型变量的复制值只复制对对象的引用,而不复制对象本身.而将一个值类型变量赋给另一个值类型变量时,将复制包含的值
- C#的引用类型包括:
(1)内置的引用类型有:object,dynamic和string
a,对象(Object)类型是C#通用类型系统(Common Type System-CTS)中所有数据类型的终极基类.Object是System.Object类的别名.所有对象(Object)类型可以被分配任何其他类型(值类型、引用类型、预定义类型或用户自定义类型)的值。但是,在分配值之前,需要先进行类型转换。
b,动态(Dynamic)类型您可以存储任何类型的值在动态数据类型变量中。这些变量的类型检查是在运行时发生的。动态类型与对象类型相似,但是对象类型变量的类型检查是在编译时发生的,而动态类型变量的类型检查是在运行时发生的。
c,字符串(String)类型允许给变量分配任何字符串值。字符串(String)类型是 System.String 类的别名。它是从对象(Object)类型派生的。字符串(String)类型的值可以通过两种形式进行分配:引号和 @引号。
(2)用户自定义引用类型有:class、数组、interface 或 delegate。