C ++引用类型参数传递与C#引用之间的区别?

时间:2009-05-29 04:16:28

标签: c# c++

我一直认为他们的情况差不多,但有人在我的一个答案中指出了我并不是这样。

编辑:Here就是我所说的和我得到的评论。 EDIT2: C ++之间的区别是什么:

public: void foo(int& bar);

和C#的

public void foo(ref int bar){

} 

4 个答案:

答案 0 :(得分:5)

在C#中,您有原始类型(整数,结构等)和引用类型(对象)。这些内置于语言中。在C ++中,你必须是明确的。下面是一组在C#和C ++中引用对象的等效方法,基于它们是引用类型还是基元,以及是否使用ref:

C# type                     | C++ Type
----------------------------+---------
Primitive type, with no ref | Normal parameter passing
Reference type, with no ref | Pointer (*)
Primitive type, with ref    | Reference (&)
Reference type, with ref    | Reference of a pointer (&*)

答案 1 :(得分:2)

C ++的参考'&'和C#的参考文献完全不同。

C#中参数的正常对象传递(即没有'ref'或'out')相当于C ++的'reference'传递。被调用者获取对象的句柄,并且修改对象上的字段确实修改了调用者最初传递的对象。在C ++中,如果传递普通对象(无引用),则被调用者获取对象的副本并修改其字段会影响调用者上下文中的原始对象。在C#中如果被调用者将 new 对象分配给参数,那么它现在将对新对象进行操作,但调用者将不会看到此更改,因为调用者仍将引用 old < / em>对象在其上下文中。

C#中的'ref'表示被调用者实际上可以更改它收到的句柄。因此,如果他将句柄分配给 new 对象,则此更改在调用者上下文中可见,传递给调用的参数现在将“指向” new 对象。这相当于C ++将引用传递给指针,因此被调用者可以更改指针指向的地址。 C#的'out'只是'ref',在初始化时有一些语义糖,所以上面所有都适用于'out'。

所有这些当然适用于C#如何操纵对象参数,而不是“值类型”(例如,int)。

答案 2 :(得分:0)

没有“const ref”(我猜在C#中称为“in”而不是“out”)。

C#编译器将“ref”视为必须在函数调用时有效的东西,并且如果你没有初始化它就会抱怨,而它将“out”视为之前不应该初始化的东西,并且必须是在返回之前分配。

您不能在C#中“引用”属性的临时值或返回值。

答案 3 :(得分:0)

存在一些差异--C#的ref仅用于参数,并且您只能传递初始化变量(使用out代替去除后一个限制); C ++的引用语法可以更自由地使用(例如,对于局部变量[必须在定义时初始化]并且不必担心在参数的情况下初始化)...但总的来说我会说差异是相当小的