在 C#中,结构体(struct)和类(class)都是用于创建自定义数据类型的方式,但它们在很多方面存在着显著的区别。掌握他们的区别至少不会产生一些我们不了解情况下发生的错误。
文章目录
一、作为参数传递时的差别
1. 类参数
- 当类的实例对象作为参数传递给一个方法时,传递的是对象的引用。这意味着在方法内部对参数对象的修改会影响到原始对象。
- 示例代码:
class MyClass
{
public int Value {
get; set; }
}
class Program
{
static void ModifyClassObject(MyClass obj)
{
obj.Value = 20;
}
static void Main()
{
MyClass classInstance = new MyClass();
classInstance.Value = 10;
ModifyClassObject(classInstance);
Console.WriteLine($"Class - Value after modification: {
classInstance.Value}");
// 输出为20,因为在ModifyClassObject方法中修改了对象的属性,而传递的是引用
}
}
2. 结构体参数
- 当结构体的实例作为参数传递给一个方法时,传递的是结构体的副本。这意味着在方法内部对参数结构体的修改不会影响到原始结构体。
- 示例代码:
struct MyStruct
{
public int Value;
}
class Program
{
static void ModifyStructObject(MyStruct structObj)
{
structObj.Value = 20;
}
static void Main()
{
MyStruct structInstance = new MyStruct();
structInstance.Value = 10;
ModifyStructObject(structInstance);
Console.WriteLine($"Struct - Value after modification: {
structInstance.Value}");
// 输出为10,因为在ModifyStructObject方法中修改的是副本,原始结构体没有被修改
}
}
二、内存分配上的区别
1. 类(引用类型)
- 类的对象实例存储在堆(Heap)内存中。堆是一个用于动态分配内存的区域,由垃圾回收器(Garbage Collector)管理。当创建一个类的对象时,会在堆中分配足够的内存来存储对象的所有成员(字段、属性等)。变量(引用)本身存储在栈(Stack)中,它包含了对象在堆中的内存地址,通过这个引用可以访问堆中的对象。
- 示例代码:
class MyClass
{
public int Value;
}
class Program
{
static void Main()
{
MyClass obj = new MyClass();
// 这里,obj是一个引用,存储在栈中,它指向堆中实际的MyClass对象
// 堆中的MyClass对象存储了Value字段
}
}