C#是一种类型安全的语言。每一个变量都要求定义为一个特定的类型,并且要求存储在变量中的值只能是这种类型的值。
变量既能保存值类型,也可以保存引用类型,还可以是指针。这一课将讲述前两种类型,关于指针的讨论我们将在下一课中进行。
下面是关于值类型和引用类型不同点的概论:
如果一个变量v存储的是值类型,则它直接存储包含数据的对象。任何其他的变量v’都不能直接存储已经由v存储了的对象,虽然v’可以存储一个和v存储的对象有着相同值的对象。(译注:这意味着,v和v’存储的对象毫不相干,任意改变其中一个存储的对象都不会影响到另一个变量存储的对象。)
如果变量v存储的是一个引用类型,它直接存储一个指向对象的引用,同时可能存在另一个变量v’,它也存储着指向这个对象的引用。(译注:这意味着,改变v’引用的对象同时也会影响到v引用的对象,反之亦然。)
值类型
在C#中你可以通过声明枚举类型或是结构类型来定义你自己的值类型。C#以同样的方式处理用户自定义的类型和C#预定义的值类型,不过C#编译器可能更优于处理后者。下面的表列出了C#中预定义的值类型的一些信息。因为在C#中所有的基本值类型都是从object类型(最终基类)发展而来,所以下表中还显示了与这些预定义类型相对应的.Net框架中的System类型。
C# 类型 | .Net 框架类型 | 有无符号 | 占据位数 | 取值范围 |
sbyte | System.Sbyte | 是 | 1 | -128 到 127 |
short | System.Int16 | 是 | 2 | -32768 到32767 |
int | System.Int32 | 是 | 4 | -2147483648 到 2147483647 |
long | System.Int64 | 是 | 8 | -9223372036854775808 到 9223372036854775807 |
byte | System.Byte | 否 | 1 | 0 到 255 |
ushort | System.Uint16 | 否 | 2 | 0 到 65535 |
uint | System.UInt32 | 否 | 4 | 0 到 4294967295 |
ulong | System.Uint64 | 否 | 8 | 0 到18446744073709551615 |
float | System.Single | 是 | 4 | 可能值从 ±1.5 x 10-45 到 ±3.4 x 1038 ,小数点后7位有效数字 |
double | System.Double | 是 | 8 | 可能值从 ±5.0 x 10-324 to ±1.7 x 10308 小数点后15到16位有效数字 |
decimal | System.Decimal | 是 | 12 | 可能值从 ±1.0 x 10-28 到±7.9 x 1028 小数点后28到29位有效数字 |
char | System.Char | N/A | 2 | 任何16位Unicode字符 |
bool | System.Boolean | N/A | 1 / 2 | true 或者false |
在下面的代码中,两个变量都声明为整形,并得到赋值:
int x = 10;
int y = x;
y = 20; // 这条语句运行后x的值为10,y的值为20;
C#预定义的引用类型包括object和string类型。正如我们在上面提到的,object类型是所有其他类型的最终基类。用户定义的引用类型可以是接口类型、类类型和委托类型(第12课会有具体介绍)。
引用类型事实上保存一个指向它引用的对象的内存地址。下面的代码段中有两个变量引用了同一个对象(本例中,假设这个对象有一个数据成员’myValue’):
object x = new object();
x.myValue = 10;
object y = x;
y.myValue = 20; // 这条语句执行后,x.myValue和y.myValue的值都为20。
上面的这段代码演示了引用类型的一个特点:改变某一个引用指向的对象的属性同时也会影响到所有其他指向这个对象的引用。不过,strings类型虽然也是引用类型,但它的工作方式更象值类型。当一个字符串被指定了另一个字符串的值时,例如:
string s1 = "hello";
string s2 = s1;
Character | Escape Sequence |
' | \' |
" | \" |
\ | \\ |
警报 | \a |
退格符 | \b |
换页符 | \f |
换行符 | \n |
回车符 | \r |
Tab 符 | \t |
垂直 Tab 符 | \v |
使用数字指定的Unicode 字符,如\u2000 | \u |
使用十六进制数指定的Unicode 字符,如\xc8 | \x |
空值 | \0 (zero |
int i = 123;
object box = i;
if (box is int)
{Console.Write("Box contains an int");} // 这一行将会打印出来。