gpt4 book ai didi

c# - 关键字 `ref` 如何影响内存管理和垃圾回收?

转载 作者:太空宇宙 更新时间:2023-11-03 21:12:53 25 4
gpt4 key购买 nike

我是 C# 的新手,我一直在弄乱“ref”、“out”和指针,我有一个关于“ref”如何工作的一般性问题,尤其是在使用对象而不是基本类型时。说这是我的方法:

public void foo(ref Point p) {
p.set(1,1); // the x/y values are updated without constructing a new Point
}

和类似的方法:

public void bar(Point p) {
p.set(1,1); // the x/y values are updated without constructing a new Point
}

编辑:Point 在这两种情况下都是一个类

两者都有效,但哪一种比另一种更划算?我知道在 C++ 中,如果你传入一个指针,你只给出了内存地址;根据我对 C# 的理解,由于自动垃圾收集,您不能将 Object* 传递到方法中。 “ref”是否将对象固定到某个位置?此外,如果将对象传递给方法,如上面的“bar”,它是传递对象的副本还是传递指针/引用?

澄清:在我的书中,它确实说如果你想要一个方法来更新原语,比如int,你需要使用ref (out 如果未初始化)或 *。我问的是对象是否也是如此,如果将对象作为参数而不是 ref 传递给对象成本更高。

最佳答案

  • 如果您的类型是结构,ref 大致等同于指向该结构的指针。这里没有创建新实例。不同之处(与不使用 ref 传递它相比)是您现在可以改变该变量中包含的原始结构实例。
  • 如果您的类型是一个类,ref 只需再添加一个间接级别。这里也没有创建新实例。不同之处(与不使用 ref 传递它相比)是您现在可以用其他东西完全替换(而不仅仅是变异)该变量引用的原始类实例。

由于在这两种情况下都没有创建新的实例,垃圾收集器可能不会以任何重要的方式关心这个。

关于c# - 关键字 `ref` 如何影响内存管理和垃圾回收?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36524963/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com