【发布时间】:2016-04-10 02:10:45
【问题描述】:
我是 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
}
EDIT:Point 在这两种情况下都是一个类
两者都有效,但其中一种是否比另一种更具成本效益?我知道在 C++ 中,如果你传入一个指针,你只会给出内存地址;根据我对 C# 的理解,由于自动垃圾收集,您不能将 Object* 传递给方法。 'ref' 是否将对象固定到某个位置?此外,如果您将对象传递给方法,例如上面的“bar”,它是传递对象的副本还是传递指针/引用?
澄清:在我的书中,它确实说如果你想要一个更新原语的方法,例如int,你需要使用ref(如果是out未初始化)或*。我在问对象是否也是如此,如果将对象作为参数而不是 ref 传递给对象成本更高。
【问题讨论】:
-
您的示例中
Point的类型是什么?如果Point是一个类类型,那么在对foo的调用完成后,对p的更改将可见,但如果Point是struct,那么如果没有ref,更改将不会在上游调用者看到的方式。 -
Point是一个类。在这种情况下是否像 Java 一样,Object捆绑了一个指针? -
你没有传递一个对象。在这两种情况下,您都传递了对对象的引用。
-
所以
ref和*都只对改变原始类型有用? (当它们是方法的参数时)
标签: c# memory-management garbage-collection ref