有什么后果(正/负)的使用 不安全 关键字 C# 使用指点?例如,变成什么,垃圾收集、什么是性能的收益/损失,什么是性能的收益/损失相对于其他语言的手册,内存管理,什么是危险的,在这种情况是它确实有理由使用这种语言的特征,是它更长的时间来编译...?

有帮助吗?

解决方案

正如已经提到了康拉德,也有一些情况下,不安全存储器在C#是有用的。有没有 作为许多 他们的,但也有一些:

  • 操纵与 Bitmap 几乎是一个典型的例子你需要一些额外的性能,你可以得到通过使用 unsafe.

  • 互操作性 与老年API(例如WinAPI或地C/C++Dll)是另一个区域在哪里 unsafe 可以是很有用-例如你可能需要调用一个功能,需要/返回一个非管理的指针。

另一方面,你可以写的事情使用 Marshall, ,其中隐藏了许多不安全的内的操作方法的呼吁。这将是一个比较慢,但这是一个选择,如果你想要避免使用 unsafe (或如果您使用VB.NET 这没有 unsafe)

积极的后果:因此,主要的积极后果的存在 unsafe C#是你可以写一些代码更容易(互操作性的),你可以写一些代码的更有效(操纵与位或者也许某些重数值计算使用的阵列-虽然,我不太确定有关第二个)。

消极的后果:当然,还有一些价格,你必须支付的使用 unsafe:

  • 非核实代码:C#代码被写入使用 unsafe 功能变得不可核查的,这意味着你的代码可以妥协的运行时以任何方式。这不是一个大问题中的一个 完全信任 方案(例如不受限制的桌面应用程序)-你只是没有所有好的。净CLR的保证。但是,不能运行的应用受限制的环境,如公共网站托管,Silverlight或部分信任(如运行的应用程序从网络)。

  • 垃圾收集器 还需要小心的时候你使用 unsafe.GC通常是允许搬迁对象在托管堆(保持记忆碎片).当你把指针指向一些目的,需要使用 fixed 关键字告诉GC它不能移动的对象,直到你完成(以及可能影响业绩的垃圾收集,但当然,这取决于确切的情况).

我猜想,如果C#没有相互操作与老年码,它可能不会支持 unsafe (和研究项目,如奇异的,试图创造更多的核查操作系统的基础上管理语言的绝对禁止usnsafe码)。然而,在现实世界, unsafe 是有用的,在一些(稀有的)的情况。

其他提示

我可以给你的地方是值得使用的情况:

我必须生成由像素的位图像素。 Drawing.Bitmap.SetPixel()是太缓慢。所以,我建的位图数据,并使用Array我自己的管理unsafe得到IntPtr Bitmap.Bitmap( Int32, Int32, Int32, PixelFormat, IntPtr)

引用专业C#2008年:

"两个主要原因在于使用 指针是:

  1. 向后兼容性 -尽管所有的设施提供的 .网运行,它仍然是可能的 呼叫机Windows API职能, 对于某些操作这个可以 唯一的方式accompling你的任务。这些API职能是一般 C编写并且经常需要 指针作为参数。然而,在 许多情况下,它可以写的 DllImport宣言》的方式 避免使用的指针;例如, 通过使用该系统。因此类。
  2. 性能 -在那些场合里的速度是最大的 的重要性,指针可以提供一个 路线优化的性能比较。如果你 知道你在做什么,你可以 确保数据被访问或 操纵的最有效的方式。但是,要知道,更多的时候 不,还有其他的领域 你的码在那里你可以做必要的 性能improvemens没有 resoirting为指针。尝试使用 码分析器来寻找瓶颈 在你的代码一个都配有视觉 Studio2008。"

如果您使用的指针,你的代码将需要更高的杠杆的信任,以执行,如果用户没有授予你的代码不会运行。

并把它包起来与最后的报价:

"我们强烈建议反对使用 指针不必要的,因为它会 这不仅是困难的写和调试, 但它也将失败的记忆 类型的安全检查实施 CLR。"

垃圾收集是低效的长寿命的对象。当大多数对象被释放相当快,和一些物品.NET的垃圾收集器的效果最好“长生不老”。问题是,再活的对象是在完全的垃圾收集,这将产生一个显著的性能损失只发布。在本质上,长生命物体迅速进入第2代

(有关详细信息,你可能想在.net的代垃圾收集器阅读起来:的 http://msdn.microsoft.com/en-us/library/ms973837.aspx

在其中的物体,或在一般的内存使用,将被长寿命的情况下,手动内存管理将产生更好的性能,因为它可以被释放到系统,而不需要一个完整的垃圾收集。

实现某种周围基于一个单一的大字节数组,结构,和大量的指针运算的,理论上可以增加在数据将被存储在RAM中很长一段时间的情况下的性能的存储器管理系统的

不幸的是,我不知道的一个很好的方式为将要长期对象,做在.net中手动内存管理。这基本上意味着,那些长期生活在RAM中的数据的应用程序时,他们运行的所有内存的完整垃圾回收会定期停止响应。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top