C ++中的指针与C#中的引用类型之间的区别

时间:2010-01-27 10:54:37

标签: c# c++ pointers reference

在C ++中,指针是指向存储另一个变量的内存地址的指针,而在C#中,引用有些相同。这两者有什么区别?

6 个答案:

答案 0 :(得分:9)

在C#中,引用类型将在不再需要时自动进行垃圾回收。

答案 1 :(得分:9)

对我而言,概念是相同的,或者至少意图相同,但实际使用的是

当我们谈论指针或参考时,我们正在谈论一个概念。这个变量“指向”或者它是对其他东西的“引用”,存储在其他地方。

如果我使用该引用,例如通过更新值,我实际上正在更新引用的对象,即变量指向的对象。如果我有一个从两个不同位置引用的对象,我实际上是从两个地方更新相同的东西。

所以这个概念可能与你在现实世界中的地址有关,只是一种引用其他东西的方式,而且这个引用可以像许多拥有我地址的人一样被共享。

不同之处在于如何使用它以及语言允许的内容。请注意,引用或指针的实现细节不是隐含在概念本身中。在C#中继续如此。

参考是一个参考,因此,仅仅对两个参考求和没有意义,或者将一个参考添加到参考中......这甚至意味着什么?我无法添加两个家庭住址(如Baker Street + Home Street)......

在C ++中,引用的实现细节实际上是引用。这样一个指针不仅仅是一个指针,它也是(并用作)一个内存地址。这样,例如,您可以添加指针,因为添加两个内存地址以获取另一个内存地址或添加4到内存地址实际上是有意义的。所以在C ++中,指针停止成为一个概念,成为实际实现细节的名称

这就是为什么在C#中,指针和引用是不同的东西。因为从语义上来说,它的含义非常相似,所以他们希望区别于旧的C和C ++概念,其中指针与内存地址相同。

我建议您阅读References are not addresses中的文章“Eric Lippert”,我相信他在解释这些差异方面做得很好。

答案 2 :(得分:1)

C#中的所谓引用是通过指向实际对象的指针实现的。它们被称为句柄,当句柄本身在程序的整个生命周期内保持固定时,内部指针随着对象在内存压缩阶段被垃圾收集器移动到内存中而改变。

答案 3 :(得分:1)

那些是不同的野兽。在C ++中,boost :: shared_ptr有点类似于C#referenecs,但也是一个独特的野兽(这两个)。

引用指向将由垃圾收集器处理的对象。 在shared_ptr的情况下也是如此。然而,C#和boost :: shared_ptr如何追踪对象的生命周期(见下文)之间存在概念上的差异。

C ++指针可能指向任何东西,在堆栈上分配(在这种情况下,不需要处理),静态地在堆上,或按需手动分配的东西,然后必须被释放,这完全取决于程序员的责任。

shared_ptr和C#引用之间的差异:

shared_ptr是一个引用计数器。它计算指针存在多少个克隆,如果没有,则处理该对象。当A指向B指向A但不再需要A和B时,这不提供针对交叉引用(或循环引用)的解决方案。

C#garbage collection处理它。 C#不计算引用。相反,它维护一个可访问性列表 - 可以通过我们拥有的所有开放指针访问的内容。什么不能,被处置。这种方法更安全,但在性能可预测性方面存在一些缺点。

答案 4 :(得分:0)

第一个区别是你不能在引用上使用指针算法。否则,他们几乎是一样的。

  • 指向/指向实际对象。
  • 两者都可以为NULL / null(即不指向有效对象)
  • 两者都可以分配一个新对象

另一个区别是垃圾收集器负责C#中分配的资源。在C ++中,你必须自己删除它们(或者使用智能指针)。

然后,当然......你不必在C#中手动取消引用引用来访问该值。

答案 5 :(得分:0)

C ++是物理级指针,用于存储物理地址的值。 C#参考 是一个隐藏或不透明的指针,你只知道它指向某个对象。

在C ++中,您可以使用物理级别的指针 - 内存操作或 用它来访问它指向的对象。

// physical level operation

// set pointer to specific address
byte *pPointer = 0x00LB10;
// increment pointer
pPointer++; 

// OR
// dereference operation for classes and structure
pPointer->MyProperty

在C#中你只能使用引用(引用类型对象) 访问对象。

MyReference.Property