【问题标题】:C# objects and memory managmentC# 对象和内存管理
【发布时间】:2023-03-16 15:12:02
【问题描述】:

假设我有以下代码,其中 Car 类只有 1 个属性:String modelname

Car c = new Car("toyota");
Car c1 = c;
Car c2 = c;
Car c3 = c;
Car c4 = c;
Car c5 = c;

这是否会每次都制作一个新的 car c 副本?所以内存中会有一个新的“toyota”字符串 5 倍?或者“toyota”字符串只会在内存中出现一次?

编辑:添加此相关链接以防您遇到与我相同的问题,我认为这会有所帮助Are arrays or lists passed by default by reference in c#?

【问题讨论】:

  • 您只是在创建引用,它们都将指向一个对象。
  • 这是语言的一个基本方面,您应该对其进行详细研究。此处的答案不会为您提供所需的理解水平。
  • 此外,C# 字符串是不可变的,每个唯一的字符串仅在内存中存在一次,即使您制作了汽车的 deep 副本
  • @DrKoch 谢谢,也很高兴知道这一点

标签: c# object


【解决方案1】:

不,“toyota”字符串只会在内存中出现一次,因为只有一个 Car 对象,有 6 个引用指向它。

【讨论】:

  • 那我怎么做 c = new car("something");那么 c1,c2,c3,c4,c5 不会更改型号名称?
  • 因为c是引用类型的变量。您正在创建第二个Car 并将其分配给c,而c1-c5 仍指向原始Car
  • @Shiro 因为你改变了变量的值,所以你没有改变所有 5 个引用指向的对象。
  • 所以会有两辆车都命名为 c ? “旧”和“新”一个?
  • 没有。将有两个Cars,第一个由c1c2c3c4c5 引用,第二个由c 引用(“命名为c”如果这就是您想要的方式)。每个变量都指向Car 的一个实例,但Cars 之一被多个变量引用。
【解决方案2】:

Car 是 Reference 类型,所以答案是否定的。见:What is the difference between a reference type and value type in c#?

【讨论】:

    【解决方案3】:

    分配引用类型只是将object引用(也就是地址)复制到变量中。它不会复制实际的data,因为引用类型变量只保存引用值,或者换句话说,是一个指示实际数据在内存中的位置的地址。因此,在这种情况下,您将有 6 个引用类型变量,它们持有对内存中相同地址的引用。

    【讨论】:

    • copies the reference (in other words address) 引用不是地址。
    • @HamletHakobyan 是的。名称可以不同,但​​它们是相同的。引用就像指针一样持有地址。否则,如果它不包含地址,它如何允许您访问实际对象?这是一个相关的问题:stackoverflow.com/questions/430112/…
    • 不,不是这样。参考 - 只是参考,仅此而已,除此之外的任何内容都来自邪恶(即实现细节):)
    猜你喜欢
    • 2011-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-13
    • 1970-01-01
    相关资源
    最近更新 更多