C ++引用了Vs C#引用

时间:2011-05-07 08:05:12

标签: c# c++

C ++参考 C#参考 之间的相似/差异是什么?

修改:

我在谈论对象引用,因为我是一个新手,我不知道这样一条简单的线会引起歧义,正如我所读到的那样。每当使用术语“reference”时,其在上下文中为Object引用,否则其明确引用为“managed references”

我认为所有回答过这个问题的人都得到了我想说的话,我发表了一个评论,清楚地说明了我想问的问题。我没有看到任何理由进行downvote,来吧。

这个问题不值得关闭。像我这样的新手可以从很多有经验的人提供的见解中学习。

4 个答案:

答案 0 :(得分:11)

C#引用更接近C ++指针而不是C ++引用。

C#引用可以为null,并且具有与指针类似的赋值语义。不同之处在于它们是黑盒子(你不能将它们转换为整数类型),你不能对它们进行算术运算。它们也只能指向引用类型。

C ++引用完全不同(除了编译为指针之外)。它们更接近用于ref参数的.net托管引用。但即使这样,赋值语义也不同。


  

引用的初始化与赋值完全不同。尽管出现了 -   没有操作员操作参考。

答案 1 :(得分:5)

非常相似。

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.

答案 2 :(得分:1)

<强>更新

显然我误解了这个问题:我理解“引用”这个词指的是“托管引用”,而不是“对象引用”。 “托管引用”(最好称为“托管指针”,我最初没有这样做)是允许在C#中使用ref int之类的功能,并且与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除外)能够声明变量具有托管引用的类型。

答案 3 :(得分:1)

这个问题似乎很准确。在阅读了所有的答案和评论后,我仍然不确定他们是否真的澄清了事情。

C#(或CLR类型系统)相对于原生C ++的一个主要简化是明确分离为值和引用类型,可以通过值或引用传递它们。

另一方面,有些简化,C ++只知道“值类型”,应用程序必须决定它们的生命周期是自动管理还是手动管理。在C ++中,术语“引用类型”表示通过编写T&声明的新类型,其中T是有效的类型名称。在C ++中,引用是一个微妙的事情:声明T&定义了“T的l值引用”,而T&&定义了“T的r值引用”(引用一个临时对象,由c ++ 0x引入的新概念都是不同的类型。

的相互绑定规则(如果作为参数传递,从函数返回,或在赋值表达式中用作l值或r值)
  • T
  • T const &
  • T const &&
  • T&
  • T&&
虽然他们为一些非常有用和强大的范例打开了可能性,但这是一场噩梦。当然,由于T*(指针类型)可以替换T中的T&或其任何替代方案,因此您可以定义“对指针类型的引用”类型上述组合。但是,相反的情况是不可能的,不允许使用“指向引用类型的指针”。

嗯,我希望我把一切都搞糊涂了......

干杯,