繁体   English   中英

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

[英]Difference between C++ reference type argument passing and C#'s ref?

我一直以为他们是同一回事,但有人在我的一个回答中指出我并非如此。

编辑: 是我所说的,我得到的评论。 Edit2:C ++之间有什么区别:

public: void foo(int& bar);

和C#

public void foo(ref int bar){

} 

在C#中,您具有基本类型(int,结构等)和引用类型(对象)。 这些是语言内置的。 在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 (&*)

C ++的引用“&”和C#的引用完全不同。

C#中参数的常规对象传递(即,没有“ ref”或“ out”)等同于C ++的“引用”传递。 被调用方获得了该对象的句柄,并且在对象上修改字段确实修改了调用方最初传递的对象。 在C ++中如果传递正常对象(无附图)被叫方获取对象的副本,并修改它的字段影响在呼叫者上下文中的原始对象。 在C#中,如果被调用方将对象分配给该参数,则它将在新对象上进行操作,但是调用方将看不到此更改,因为调用方仍将在其上下文中引用对象。

C#中的“ ref”表示被调用者实际上可以更改已收到的句柄 因此,如果他将句柄分配给对象,则此更改在调用者上下文中可见,传递给调用的参数现在将“指向” 对象。 这等效于C ++ 向指针传递引用 ,以便被调用者可以更改指针指向的地址。 C#的“输出”只是“引用”,并带有一些围绕初始化的语义糖,因此上述所有内容都适用于“输出”。

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

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

C#编译器将“ ref”视为必须在函数调用时有效的东西,并抱怨您是否尚未对其进行初始化,而将“ out”视为不应在此之前初始化的东西,并且必须在返回之前进行赋值。

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

有一些区别-C#的ref仅用于参数,并且您只能传递初始化的变量(使用out来消除后者的限制); 可以更自由地使用C ++的参考语法(例如,对于局部变量[必须在定义时初始化],并且对于参数的情况,不必担心初始化)...但是总的来说,我认为区别只是很小的区别。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM