C++引用与 C# 引用
本文关键字:引用 C++ | 更新日期: 2023-09-27 17:55:33
C++引用 和 C# 引用之间有什么异同?
编辑:
我说的是对象引用,因为我是一个新手,我不知道这么简单的一行会导致歧义,正如我所读到的。每当使用术语"引用"时,它在上下文中指向对象引用,否则明确引用为"托管引用"。
我想所有回答这个问题的人都明白我想说的话,我发表了一个评论,清楚地说明了我想问什么。我看不出有任何理由投反对票,来吧伙计们。
这个问题不值得结束。像我这样的新手可以从许多有经验的人提供的见解中学习。
C# 引用更接近C++指针,而不是C++引用。
C# 引用可以为 null,并且具有类似于指针的赋值语义。不同之处在于它们是黑盒(你不能将它们转换为整数类型),你不能对它们做算术。它们也只能指向引用类型。
C++引用是完全不同的(除了被编译为指针)。它们更接近于用于ref
参数的 .net 托管引用。但即便如此,赋值语义也有所不同。
引用的初始化与赋值完全不同。尽管出现了—— ANCE,则没有运算符对引用进行操作。
不太相似。
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
的功能,并且与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
是有效的类型名称。在C++引用是一个微妙的东西:声明T&
定义了"对T
的l值引用",而T&&
定义了"对T
的r值引用"(对临时对象的引用,c++0x引入的新概念)两者都有不同的类型。相互绑定规则(如果作为参数传递、从函数返回或在赋值表达式中用作 l 值或 r 值)的
-
T
-
T const &
-
T const &&
-
T&
-
T&&
是一场噩梦,尽管它们为一些非常有用和强大的范式开辟了可能性。当然,由于T*
(指针类型)可以替换为T&
中的任何一种替代项T
,因此您可以使用上述所有组合定义"对指针类型的引用"类型。但是,相反的情况是不可能的,不允许使用"指向引用类型的指针"。
呵,我希望我把一切都弄糊涂了...
干杯
保罗