解释和对比 C# 中的值类型和引用类型
csharpserver side programmingprogramming
一般来说,C# 中的所有类型都可以分为两个主要类别:值类型和引用类型。让我们详细了解每种类型。
值类型
值类型的变量直接包含其数据。每个变量都有自己的数据副本。因此,值类型的变量不可能修改另一个对象。
值类型可以是以下类型之一 −
- 所有数字类型,例如 int、float 和 double
- char 和 bool 类型
- struct 类型或
- 枚举 类型。
值类型仅包含值。例如,整数类型包含实际数字,而不是指向数字的指针,如引用类型。
要创建自定义值类型,可以使用结构。例如 −
public struct Point { public int X; public int Y; } var p1 = new Point();
在内存中,Point 的实例表示如下 −
当您将值类型的变量分配给另一个变量时,赋值操作会创建被分配值的副本。例如,
Point p2 = p1;
引用类型
引用类型的变量存储对其对象的引用。两个不同的变量可以保存对同一对象的引用。一个变量对对象所做的任何更改对第二个变量都是可见的。
引用类型包括以下类型 −
- String
- Class
- Array
- Delegate
- Interface
例如,您可以创建一个类,它是引用类型,如下所示 −
public class Point{ public int X; public int Y; } var p1 = new Point();
当您将引用类型的变量分配给另一个变量时,赋值操作只会复制引用,而不是实际对象。
Point p2 = p1;
示例
using System; class Program{ static void Main(){ var p1 = new Point { X = 10 }; Point p2 = p1; p2.X = 20; Console.WriteLine("Value Type"); Console.WriteLine(p1.X); Console.WriteLine(p2.X); var u1 = new User { Age = 10 }; User u2 = u1; u2.Age = 20; Console.WriteLine("Reference Type"); Console.WriteLine(u1.Age); Console.WriteLine(u2.Age); } } public struct Point{ public int X; public int Y; } public class User{ public int Age { get; set; } }
输出
Value Type 10 20 Reference Type 20 20