在下面的代码中,两个变量都声明为整形,并得到赋值: 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; s2和s1都引用了同一个字符串类型,但是当s1的值发生改变时,例如s1=”goodbye”;s2的值仍然是”hello”。之所以会这样,是因为当改变s1的值是,新创建了一个string对象,s1引用这个新的string对象;s2仍然引用原来string对象。产生这种行为的原因是string对象是恒定的,也就是说,一旦一个string对象被创建,它的值就不能再修改,所以当改变一个字符串变量的值的时候,仅仅是新创建了一个包含修改内容的新的string对象。 转义序列和逐字字符串(verbatim strings) 当声明一个字符串变量时有一些字符是不能以平常的方式包含在变量中的。为了解决这个问题,C#提供了两种不同的方法。 第一种方法是使用’转义序列’。例如,我们想得到如下的字符串 “Hello World How are you” 我们可以使用下面的语句声明字符串:string a = "/"Hello World/nHow are you/""。这条语句中使用了”和换行符的转义序列。更多字符的转义序列可以参见下表: Character | Escape Sequence | ' | /' | " | /" | / | // | 警报 | /a | 退格符 | /b | 换页符 | /f | 换行符 | /n | 回车符 | /r | Tab 符 | /t | 垂直 Tab 符 | /v | 使用数字指定的Unicode 字符,如/u2000 | /u | 使用十六进制数指定的Unicode 字符,如/xc8 | /x | 空值 | /0 (zero |
第二种方法是使用’逐字字符串’文本。这种方法将想要得到的字符串放在@”和”之间。假如我们需要将C:/My Documents/赋值给’path’,我们可以使用转义序列方法:string path = "C://My Documents//";也可以使用如下的语句:string path = @"C:/MyDocuments/"。 通过使用后一种方法得到的字符串还可以横跨多行而不需要使用’/n’。使用这种方法唯一需要使用到转义序列的字符串是”,其转义字符为””(两个连在一起的双引号)。例如想将the word "big" contains three letters.赋值给’text’,我们就可以使用如下的语句:string text = @"the word ""big"" contains three letters."。 装箱 C#允许你将任何的值类型转换为对应的引用类型,也可以将得到的引用类型再转换为值类型。下面的代码演示了这种转换――装箱: int i = 123;
object box = i;
if (box is int)
{Console.Write("Box contains an int");} // 这一行将会打印出来。 当第2行的代码执行后,对象’box’将被初始化,i保存的值将被复制给这个对象。值得注意的一件趣事是box运行时的类型将是被装箱的值类型(本例中即为int)。’is’操作符将返回box的类型为int。
|