



 3.2 引用类型
    3.2 引用类型
   C#预定义的引用类型包括object和string两种类型。而用户定义的引用类型可以是接口类型、类类型和委托类型。引用类型实例总是从托管堆上分配,引用类型实例内存的回收通过垃圾收集器。
引用类型实例分配在托管堆上,变量保存了实例数据的内存引用。引用类型可以是自描述类型、指针类型或接口类型。而自描述类型进一步细分成数组和类类型。类类型则可以是用户定义的类、装箱的值类型和委托。通常声明为以下类型:class、interface、delegate、object、string及其他的自定义引用类型时,该变量即为引用类型。
在C#中有以下一些常用引用类型。
□ 数组:(派生于System.Array);
□ 指针:Indicator(指针);
□ 接口:interface(接口)。
用户使用定义的以下类型。
□ 类:class(派生于System.Object);
□ 委托:delegate(派生于System.Delegate)。
□ object(System.Object的别名);
□ 字符串:string(System.String的别名)。
【实例3-1】本例将创建一个控制台应用程序,当用户输入自己的名字后,显示“欢迎**使用C# 4.0开发平台!”。
(1)创建控制台应用程序启动Visual Studio 2010,选择“文件”→“新建”命令,在“项目”选项卡中选择“控制台应用程序”,创建一个名称为“3.1”的控制台应用程序,如图3-2所示。
(2)编写字符串引用类型的代码,如下所示:
 
   【代码解析】 第11~15行创建公共静态字符函数NewStr()。
【运行效果】 代码编写完成之后,按“F5”键或者单击工具栏中的“启动调试”按钮,当用户输入“FREEMEN”后,按“Enter”键,显示结构如图3-3所示。
 
    图3-2 创建3.1的项目
 
    图3-3 运行结果
引用类型事实上保存一个指向它引用的对象的内存地址。上面的代码段中有两个字符串变量(yourname和newstr)引用了同一个string对象。改变某一个引用指向的对象的属性同时也会影响所有其他指向这个对象的引用。当字符串newstr发生变化时,字符串yourname也跟着发生变化。产生这种行为的原因是由于string对象是恒定的,也就是说,一旦一个string对象被创建,它的值就不能再修改,所以当改变一个字符串变量的值的时候,仅仅是新创建了一个包含修改内容的新的string对象。
引用类型赋值时,将会产生一个对该堆上同一个对象的新引用。下面将以引用类型中的class类型为例,实现引用类型的赋值及原始值的覆盖。
【实例3-2】 本节将创建一个控制台应用程序,实现引用类型的赋值及原始值的覆盖。
(1)创建控制台应用程序启动Visual Studio 2010,选择“文件”→“新建”菜单命令,在“项目”选项卡中选择“控制台应用程序”,创建一个名称为“3.2”的控制台应用程序。
(2)编写Person类代码,并在Program类中实现引用类型的赋值,代码如下:
 
     
    【代码解析】 第1~14行创建Person类,在该类中完成年龄的定义、输出。第17~29行使用数组对象操作方法操作Person类。第45行实例化Person类。
上面代码完全是对同一Person对象的操作,被调用者可以改变对象的状态数据的值和所引用的对象,可重新赋值。
【运行效果】 代码编写完成之后,按“F5”键或者单击工具栏中的“启动调试”按钮,显示结果如图3-4所示。
 
    图3-4 运行结果