从C#中的结构体和类的区别中看引用和值的问题

在 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字段
    }
}

2. 结构

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

河西石头

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值