C# 编程指南:值类型(Value Types)和引用类型(Reference Types)

在 C# 中,数据类型可以分为值类型(Value Types)和引用类型(Reference Types)。这两种类型在内存中的存储方式和行为有所不同:

部分
1
值类型
值类型的变量直接存储值本身,而不是引用到内存中的对象。
值类型在栈上分配内存空间。
当值类型的变量被赋予新值或传递给方法时,会创建变量的副本。
值类型的操作是基于值的比较和操作。
示例代码:
// 值类型示例
int x = 10; // 声明一个 int 类型的值类型变量
int y = x; // 创建 x 的副本赋值给 y
x = 20; // 修改 x 的值,y 的值不受影响

Console.WriteLine(x); // 输出 20
Console.WriteLine(y); // 输出 10
部分
2
引用类型
引用类型的变量存储的是对象的引用,而不是对象本身的值。
引用类型的对象在堆上分配内存空间。
当引用类型的变量被赋予新值或传递给方法时,只是复制了引用,而不是对象本身。
引用类型的操作是基于引用的比较和操作。
示例代码:
// 引用类型示例
int[] array1 = { 1, 2, 3 }; // 声明一个 int 数组并初始化
int[] array2 = array1; // 复制 array1 的引用给 array2
array1[0] = 10; // 修改 array1 中的值,array2 中的值也会改变

Console.WriteLine(array1[0]); // 输出 10
Console.WriteLine(array2[0]); // 输出 10
除了数组,字符串(string)也是引用类型的例子:
// 引用类型示例:字符串
string str1 = "Hello";
string str2 = str1; // 复制 str1 的引用给 str2
str1 = "World"; // 修改 str1 的值,str2 的值不受影响

Console.WriteLine(str1); // 输出 "World"
Console.WriteLine(str2); // 输出 "Hello"

需要注意的是,虽然 string 是引用类型,但它在使用上更接近于值类型。这是因为字符串具有不可变性,即字符串对象的值在创建后不可更改。因此,当对字符串进行修改时,实际上是创建了一个新的字符串对象,而原始字符串对象保持不变。

    目录

  • 1.
    值类型
  • 2.
    引用类型