在C#中,值类型和引用类型的主要区别在于它们在内存中的存储和传递方式。
值类型直接存储它们所包含的数据值。值类型变量直接包含其数据,当值类型变量被赋值给另一个变量时,会创建该值的一个副本。C#中的基本数据类型(如int、float、bool、char、enum和struct)以及可空类型(如int?)都是值类型。
引用类型存储对数据的引用,而不是实际的数据。当引用类型变量被赋值给另一个变量时,复制的是引用(即内存地址),而不是实际的数据。C#中的类(class)、接口(interface)、委托(delegate)和数组(array,尽管它们看起来像值类型,但实际上是引用类型)都是引用类型。
请看以下实例讲解:
// 值类型示例 - 结构体
struct Point
{
public int X;
public int Y;
}
// 引用类型示例 - 类
class Person
{
public string Name;
public int Age;
}
class Program
{
static void Main()
{
// 值类型使用
Point p1 = new Point { X = 1, Y = 2 };
Point p2 = p1; // 复制值,p1和p2是不同的实例,但包含相同的数据
p2.X = 10; // 修改p2不会影响p1
// 引用类型使用
Person person1 = new Person { Name = "Alice", Age = 30 };
Person person2 = person1; // 复制引用,person1和person2引用同一个对象
person2.Name = "Bob"; // 修改person2也会影响person1,因为它们引用同一个对象
Console.WriteLine($"p1: ({p1.X}, {p1.Y})"); // 输出: p1: (1, 2)
Console.WriteLine($"p2: ({p2.X}, {p2.Y})"); // 输出: p2: (10, 2)
Console.WriteLine($"person1.Name: {person1.Name}"); // 输出: person1.Name: Bob
Console.WriteLine($"person2.Name: {person2.Name}"); // 输出: person2.Name: Bob
}
}