C ++引用Vs C#引用
C ++参考和C#参考之间有什么相似之处?
编辑:
我在谈论对象引用,因为我是一个新手,我不知道这样一条简单的线会引起歧义,正如我所读到的那样。 每当使用术语“引用”时 ,它在对象引用的上下文中,否则其明确引用为“托管引用” 。
我想所有回答过这个问题的人都得到了我想说的话,我做了一个评论,清楚说明了我想问的问题。 我没有看到任何理由进行downvote,来吧。
这个问题不值得关闭。像我这样的新手可以从很多有经验的人提供的见解中学习。
C#引用更接近C ++指针而不是C ++引用。
C#引用可以为null,并且具有与指针类似的赋值语义。 区别在于它们是黑盒子(你不能将它们转换为整数类型),你不能对它们进行算术运算。 它们也只能指向引用类型。
C ++引用完全不同(除了编译为指针之外)。 它们更接近用于ref
参数的.net管理引用。 但即便如此,赋值语义也不同。
引用的初始化与赋值完全不同。 尽管有外观,但没有操作员操作参考。
不是很相似。
C#中唯一看起来像C ++引用的东西是带有ref
关键字的参数。 没有参考变量或字段的等价物。
C#引用在大多数方面更像是C ++指针。 它们可以是null
等。
编辑
在C#中,术语“引用”始终表示对象引用。 取消引用是自动的,这可以使得与C ++的比较有点困难:
string h = "hello"; int len = h.Length; // dereference, Length is a property of the instance h = null; // no de-referencing, h itself becomes null.
更新 :
显然我误解了这个问题:我理解“引用”这个词是指“管理引用”,而不是“对象引用”。 “托管引用”(最好称为“托管指针”,我最初没有这样做)是允许在C#中使用ref int
类的function,并且与 C ++引用非常相似 。 它们是.NET Framework概念,但不是 C#概念。 通过对比,“对象引用”(或仅仅是“引用”)仅仅是指引用类型 。
在下面的答案中,我指的是托管引用/指针, 而不是对象。
在实现中,它们几乎完全相同:只是花哨的指针,不应该是null
。
在代码中,它们有些不同:首先,你不能在C#中有一个“引用变量”,但你可以在C ++中。
也就是说,你可以说
int x = 5; int& y = x;
在C ++中,你不能说:
int x = 5; ref int y = x;
在C#中。
但通常的赋值语义适用:分配给引用分配给目标; 没有办法在C#或C ++中更改引用本身。
但是,从技术上讲, 完全不允许 .NET框架具有“引用int”; 实际上,这种类型确实存在。 但据我所知,没有.NET语言(纯IL除外)能够声明变量具有托管引用的类型。
这个问题似乎很准确。 在阅读完所有答案和评论之后,我仍然不确定他们是否真的澄清了事情。
与原生C ++相比,C#(或CLR类型系统)的主要简化之一是明确分离为值和引用类型,可以通过值或引用传递它们。
另一方面,有些简化,C ++只知道“值类型”,应用程序必须决定它们的生命周期是自动管理还是手动管理。 在C ++中,术语“引用类型”表示通过写入T&
声明的新类型T&
其中T
是有效的类型名称。 在C ++中,引用是一个微妙的事情:声明T&
定义“对T
l值引用”,而T&&
定义“对T
r值引用”(引用临时对象,由c ++ 0x引入的新概念)不同类型。 相互绑定规则(如果作为参数传递,从函数返回,或在赋值表达式中用作l值或r值)
-
T
-
T const &
-
T const &&
-
T&
-
T&&
虽然他们为一些非常有用和强大的范例打开了可能性,但这是一场噩梦。 当然,由于T*
(指针类型)可以替换T
中的T&
或其任何替代,您可以使用上述所有组合定义“指针类型”类型的引用。 但是,相反的情况是不可能的,不允许使用“指向引用类型的指针”。
嗯,我希望我把一切都搞糊涂了……
干杯,
保罗