C#中除了基本类型以外的类型都是引用类型。引用类型的特点是,在堆栈中存储的是该引 用类型指向的堆中的“地址”。所以,当引用类型之间相互赋值的时候,只是将堆栈中的值 (可以理解为所指向的“堆”地址)相互赋值,这样一来他们指向的其实是一个地址。见下 面的例子: ### C#中引用类型的赋值详解 在C#编程语言中,变量分为两种类型:值类型和引用类型。本文将重点介绍引用类型的赋值特点及其背后的实现机制。 #### 一、引用类型的定义与特点 在C#中,除了基本类型(如`int`、`char`、`float`等)之外的所有类型都属于引用类型。引用类型包括但不限于类、数组、接口、委托等。这些类型的变量实际上并不直接存储数据本身,而是存储一个指向实际数据所在位置的内存地址。这意味着当你创建一个引用类型的实例时,它会分配在堆内存中,并且变量只包含一个指向这个堆内存地址的引用。 #### 二、引用类型赋值过程解析 当我们对引用类型的变量进行赋值操作时,实际上是将源变量所指向的内存地址复制给目标变量。这样两个变量就会指向同一块内存区域。下面通过具体示例来进一步理解这一概念。 #### 三、代码示例分析 考虑以下代码段: ```csharp using System; namespace TryClassValue { class Program { static void Main(string[] args) { MyClassA a = new MyClassA(); MyClassA b = new MyClassA(); // 创建新对象并初始化 MyClassA c = a; // 将a的引用赋值给c,此时c与a指向同一个对象 Console.WriteLine("\r\na.str=\"I am a\";"); a.str = "I am a"; // 修改a指向的对象的属性 a.seta(1); a.Print(); b.Print(); c.Print(); Console.WriteLine("\r\nb.str=\"I am b\";"); b.str = "I am b"; // 修改b指向的对象的属性 b.seta(2); a.Print(); b.Print(); c.Print(); Console.WriteLine("\r\nc.str=\"I am c\";"); c.str = "I am c"; // 修改c指向的对象的属性 c.seta(3); a.Print(); b.Print(); c.Print(); // 将c的引用赋值给a,此时a与b指向同一个对象 // 而c仍然指向原来的对象 a = b; b.seta(5); Console.WriteLine("\r\nb = a;"); Console.WriteLine("\r\nb.str=\"I am b\";"); b.str = "I am b"; // 修改b指向的对象的属性 a.Print(); b.Print(); c.Print(); Console.ReadKey(); } } class MyClassA { private int a = 0; public string str = "Default"; public void seta(int x) { a = x; } public void Print() { Console.WriteLine("a={0}, str=\"{1}\"", a, str); } } } ``` #### 四、运行结果解读 程序运行后,输出结果如下: ``` a=1, str="I am a" a=0, str="Default" a=1, str="I am a" a=1, str="I am a" a=2, str="I am b" a=1, str="I am a" a=3, str="I am c" a=3, str="I am c" a=1, str="I am a" a=5, str="I am b" a=5, str="I am b" a=3, str="I am c" ``` 通过观察输出结果可以看出: 1. 当`c`被赋值为`a`时,它们指向了同一个对象。 2. 后续修改`a`或`c`的属性时,由于它们指向同一个对象,因此属性值会被同时更新。 3. 当`a`被赋值为`b`时,`a`和`b`指向了同一个对象,而`c`仍指向之前对象。 #### 五、结论 C#中引用类型的赋值操作实际上只是传递了指向对象的引用,而不是复制整个对象本身。这意味着在处理大型对象时,引用类型的赋值操作比值类型的赋值更加高效。然而,在某些场景下需要注意这种特性可能导致的副作用,比如意外地修改了其他变量指向的对象的状态。因此,在实际开发过程中合理利用引用类型可以有效提高程序性能和资源利用率。
- dongquestion2013-08-29对应用类型讲解的蛮详细的
- 粉丝: 1
- 资源: 11
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助