[英]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.