在C#中数据类型分为值类型和引用类型,值类型例如:int、bool、long等,引用类型例如:string等。
从概念上,值类型和引用类型的区别是:值类型直接存储其值,而引用类型存储对值的引用。
这两种类型存储在内存中的不同位置,值类型存储在内存的堆栈中,引用类型存储在托管堆上。注意,区分某个类型是值类型还是引用类型,因为这种存储位置的不同会有不同的影响。例如,int是值类型,int i=20;int j=i;//这两个语句会在内存的两个地方存储20;
假设已经定义了一个类Vector,Vector是一个引用类型,他有一个int类型的成员变量Value;
Vector x,y;
x=new Vector();
x.Value=20;
y=x;
Console.WriteLine(y.Value);
y.Value=50;
Console.WriteLine(x.Value);
那么在控制台中会输出什么呢?
Vector只有一个对象,x、y为引用类型的变量,声明的这两个变量都指向该对象,所以,输出的值为20和50.
如果变量是一个引用,那么可以把其值设置为null,表示不引用任何对象。
如果将引用设置为null,那就不能对他调用任何非静态的成员函数或字段,这么做运行期间会抛出异常。
值类型是通过值复制来的。
大多数更复杂的C#数据类型,包括我们自己声明的类都是引用类型。
C#有15个预定义类型,其中13个是值类型,2格式引用类型(string和object);
C#支持8个预定义整数类型,如下表所示:
名称 | CTS类型 | 说明 | 范围 |
sbyte | System.SByte | 8位有符号整数 | -128~127 |
short | System.Int16 | 16位有符号整数 | -32768~32767 |
int | System.Int32 | 32位有符号整数 | -2147483648~2147483647 |
long | System.Int64 | 64位有符号整数 | -9223372036854775808~9223372036854775807 |
byte | System.Byte | 8位无符号整数 | 0~255 |
ushort | System.UInt16 | 16位无符号整数 | 0~65535 |
uint | System.UInt32 | 32位无符号整数 | 0~4294967295 |
ulong | System.UInt64 | 64位无符号整数 | 0~18446744073709551615 |
浮点类型:
名称 | CTS类型 | 说明 | 位数 | 范围(大致) |
float | System。Single | 32位单精度浮点数 | 7 | |
double | System。Double | 64位双精度浮点数 | 15/16 |
decimal类型
名称 | CTS类型 | 说明 | 位数 |
decimal | System。Decimal | 128位高精度十进制数表示法 | 28 |
bool类型:
名称 | CTS类型 | 说明 | 位数 |
bool | System。Boolean | 表示true/false | NA |
字符类型:
名称 | CTS类型 | 值 |
char | System。Char | 表示一个16位的(Unicode)字符 |
预定义的引用类型:
名称 | CTS类型 | 说明 |
object | System。Object | 根类型,CTS中的其他类型都是从他派生而来的(包括值类型) |
string | System。String | Unicode字符串 |