在C#中,变量可以分为两大类:值类型(Value Types)和引用类型(Reference Types)。这两者在内存中的存储方式、赋值行为以及它们的行为表现上都有着显著的不同。
### 值类型(Value Types)
值类型变量直接包含其数据。当你将一个值类型变量赋给另一个值类型变量时,实际上是复制了数据。这意味着,两个变量包含的是相同数据的两份拷贝,它们之间相互独立。值类型包括所有的基本数据类型(如int, float, char, bool等)以及结构体(struct)。
**实例**:
int a = 5;
int b = a; // b是a的一个拷贝,改变a不会影响b
a = 10;
Console.WriteLine(b); // 输出5
### 引用类型(Reference Types)
引用类型变量存储的是数据的引用(即内存地址),而不是数据本身。这意味着,当你将一个引用类型变量赋给另一个引用类型变量时,两个变量都指向同一块内存地址。因此,通过任何一个变量所做的修改都会影响到这块内存中的数据,进而影响到另一个变量。引用类型包括类(class)、接口(interface)、数组(array)以及字符串(string在C#中虽然表现得像值类型,但在某些方面却是引用类型)。
**实例**:
class MyClass
{
public int Value { get; set; }
}
MyClass obj1 = new MyClass { Value = 5 };
MyClass obj2 = obj1; // obj2和obj1都指向同一块内存地址
obj1.Value = 10;
Console.WriteLine(obj2.Value); // 输出10,因为obj2也指向了修改后的对象
在这个例子中,`obj1`和`obj2`都引用了同一个`MyClass`实例。因此,当通过`obj1`修改`Value`属性时,`obj2`看到的也是修改后的值。