当前位置:  开发笔记 > 编程语言 > 正文

C#Reference和指针有什么区别?

如何解决《C#Reference和指针有什么区别?》经验,为你挑选了7个好方法。

我不太了解C#引用和指针之间的区别.他们都指向记忆中的一个地方不是吗?我能弄清楚的唯一区别是指针不是那么聪明,不能指向堆上的任何东西,免于垃圾收集,并且只能引用结构或基类型.

我问的一个原因是,有一种观点认为人们需要很好地理解指针(从C,我猜)是一个优秀的程序员.许多学习更高级语言的人都错过了这个,因此有这个弱点.

我只是不知道指针的复杂程度如何?它基本上只是对内存中某个地方的引用不是吗?它可以返回它的位置并直接与该位置的对象进行交互?

我错过了一个重点吗?



1> JaredPar..:

指针和引用之间存在轻微但非常重要的区别.指针指向内存中的某个位置,而引用指向内存中的对象.指针不是"类型安全",因为您无法保证它们所指向的内存的正确性.

以下面的代码为例

int* p1 = GetAPointer();

从某种意义上说,这是类型安全的,GetAPointer必须返回与int*兼容的类型.然而,仍然无法保证*p1实际上会指向一个int.它可以是char,double或只是指向随机存储器的指针.

然而,引用指向特定对象.对象可以在内存中移动,但引用不能无效(除非您使用不安全的代码).在这方面,参考文献比指针更安全.

string str = GetAString();

在这种情况下,str具有两个状态之一1)它指向没有对象,因此为空或2)它指向有效的字符串.而已.CLR保证了这种情况.它不能也不会用于指针.


很棒的解释.

2> Mehrdad Afsh..:

C#引用可以并且将由垃圾收集器重定位,但是普通指针是静态的.这就是我们fixed在获取指向数组元素的指针时使用关键字以防止它被移动的原因.

编辑:从概念上讲,是的.它们或多或少相同.



3> Chris Conway..:

引用是一个"抽象"指针:你不能用引用算术,你不能用它的值玩任何低级技巧.



4> ctacke..:

首先,我认为你需要在你的sematics中定义一个"指针".你的意思是,你可以在不安全的代码创建一个具有指针固定?你的意思是你可能从本机电话或Marshal.AllocHGlobal获得的IntPtr?你的意思是GCHandle?所有这些都是基本相同的东西 - 存储内容的存储器地址的表示 - 无论是类,数字,结构还是其他.而且为了记录,他们当然可以在堆上.

指针(以上所有版本)都是固定项.GC不知道该地址是什么,因此无法管理对象的内存或生命.这意味着您将失去垃圾收集系统的所有好处.您必须手动管理对象内存,否则可能会发生泄漏.

另一方面,引用几乎是GC知道的"托管指针".这仍然是一个对象的地址,但现在的GC知道目标的细节,因此它可以左右移动,这样做compactions,最终确定,处置和所有其他不错的东西托管环境中一样.

实际上,主要区别在于您如何以及为何使用它们.对于托管语言中的绝大多数情况,您将使用对象引用.指针对于实现互操作以及对快速工作的罕见需求变得很方便.

编辑:其实这里有一个很好的例子,当你可以使用托管代码中的"指针" -在这种情况下,它是一个的GCHandle,但同样的事情可能已经与AllocHGlobal或使用固定的字节数组或结构上完成的.我倾向于选择GCHandle,因为它对我来说更像是".NET".



5> supercat..:

引用和指针之间的主要区别在于,指针是位的集合,其内容仅在将其主动用作指针时才重要,而引用不仅封装了一组位,而且还封装了一些保留元数据的元数据。底层框架告知其存在。如果指针指向内存中的某个对象,并且删除了该对象但未擦除该指针,则除非或直到尝试访问它所指向的内存,否则指针的继续存在不会造成任何损害。如果未尝试使用指针,则不会关心它的存在。相比之下,基于引用的框架(如.NET或JVM)要求系统始终有可能标识存在的每个对象引用,并且存在的每个对象引用必须始终是null 否则,请识别其正确类型的对象。

请注意,每个对象引用实际上都封装了两种信息:(1)它标识的对象的字段内容,以及(2)对同一对象的其他引用集。尽管没有任何机制可以使系统快速识别存在于对象的所有引用,但是存在于该对象的其他引用集通常可能是引用封装的最重要的东西(尤其是当类型Object的事物用作锁定令牌之类的事物)。尽管系统为每个对象保留了几位数据供使用GetHashCode,但对象除了存在的引用集外没有其他真实身份。如果X拥有对对象的唯一现存引用,则替换X引用具有相同字段内容的新对象将不会产生可识别的效果,除非更改所返回的位GetHashCode(),甚至不能保证该效果。



6> Tamas Czineg..:

指针指向内存地址空间中的某个位置.引用指向数据结构.数据结构都是垃圾收集器(用于压缩内存空间)所有时间(好吧,不是经常,但是时不时地).此外,正如您所说,没有引用的数据结构将在一段时间后收集垃圾.

此外,指针仅在不安全的上下文中可用.



7> jdigital..:

指针可以指向应用程序地址空间中的任何字节。.NET环境对引用进行了严格的约束,控制和管理。

推荐阅读
贾志军
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有