C和x2B之间的差异+;引用类型参数传递和C#';裁判?
我一直认为它们是关于同一件事,但有人在我的一个答案中指出,这不完全是真的 编辑:是我说的话和我得到的评论。 编辑2: C++之间的区别是什么:C和x2B之间的差异+;引用类型参数传递和C#';裁判?,c#,c++,C#,C++,我一直认为它们是关于同一件事,但有人在我的一个答案中指出,这不完全是真的 编辑:是我说的话和我得到的评论。 编辑2: C++之间的区别是什么: public: void foo(int& bar); 和C#s 这里没有“const ref”(我想在C#中,它应该被称为“in”而不是“out”) C#编译器将“ref”视为在函数调用时必须有效的东西,并在您尚未初始化它时进行投诉,而将“out”视为之前不应初始化的东西,必须在返回之前进行赋值 不能在C#中“ref”临时或属性的返回值。有一
public: void foo(int& bar);
和C#s
这里没有“const ref”(我想在C#中,它应该被称为“in”而不是“out”)
C#编译器将“ref”视为在函数调用时必须有效的东西,并在您尚未初始化它时进行投诉,而将“out”视为之前不应初始化的东西,必须在返回之前进行赋值
不能在C#中“ref”临时或属性的返回值。有一些区别——C#的
ref
仅用于参数,并且只能传递初始化的变量(使用out
来删除后一个限制);可以更自由地使用C++的引用语法(例如,对于局部变量[必须在定义时初始化],并且不必担心参数的初始化)。。。但总的来说,我想说的是,它们之间的差异非常小。C++的reference&'和C#的ref是完全不同的
C#中参数的正常对象传递(即没有'ref'或'out')与C++的'reference'传递是等价的。被调用者获得对象的句柄,修改对象上的字段会修改调用者最初传递的对象。在C++中,如果传递正常对象(没有引用),被调用方将获得对象的副本,并修改其字段“<强> > < >强> >影响调用方上下文中的原始对象。在C#中,如果被调用方将一个新对象分配给参数,那么它现在将对新对象进行操作,但调用方不会看到此更改,因为调用方仍将在其上下文中引用旧对象
C#中的“ref”表示被调用方可以实际更改其接收到的句柄。因此,如果他将句柄分配给一个新对象,这个更改在调用方上下文中可见,传递给调用的参数现在将“指向”新对象。这相当于C++将引用传递给指针,以便被调用方可以更改指针指向的地址。C#的'out'只是'ref',在初始化时有一些语义上的甜点,所以以上所有内容都适用于'out'
所有这些当然都适用于C#如何操作对象参数,而不是“值类型”(例如int)。在C#中,有基本类型(int、structs等)和引用类型(对象)。这些都是内置于语言中的。在C++中,必须显式。这里是一组引用C和C++对象的等价方法,基于它们是引用类型还是基元,以及是否使用REF:< /P>
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 (&*)
这是否意味着“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 (&*)