何时使用C#/ .NET中的指针?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (34)

我知道C#让程序员能够访问,在不安全的上下文中使用指针。但是,这何时需要?

在什么情况下,使用指针变得不可避免?

仅仅是出于性能原因?

此外,为什么C#通过不安全的上下文来暴露此功能,并从中删除所有托管的优势?理论上可以使用指针而不会失去托管环境的任何优势吗?

提问于
用户回答回答于

这是什么时候需要的?在什么情况下使用指针变得不可避免?

如果管理的安全解决方案的净成本不可接受,但不安全解决方案的净成本可以接受。可以通过从总成本中减去总收益来确定净成本或净收益。不安全解决方案的好处是“不必浪费在不必要的运行时间检查上以确保正确性”; 成本是(1)即使在托管安全系统关闭的情况下也必须编写安全的代码,(2)必须处理可能使垃圾收集器效率低下的代码,因为它不能在具有非托管指针的内存之间移动它。

或者,如果你是编写编组层的人。

仅仅是出于性能原因?

出于性能以外的原因,在托管语言中使用指针看起来很倒霉。

在绝大多数情况下,可以使用Marshal类中的方法来处理与非托管代码的互操作。(可能有少数情况下使用编组设备很难或不可能解决互操作问题,但我不知道。)

当然,正如我所说的,如果你是编写元帅班的人,那么显然你不能使用编组层来解决你的问题。在这种情况下,你需要使用指针来实现它。

为什么C#通过不安全的上下文公开这个功能,并从中删除所有的管理优势?

这些管理优势伴随着性能成本。例如,每次向阵列提交第十个元素时,运行时都需要检查是否存在第十个元素,如果没有,则抛出异常。使用运行时成本被消除的指针。

相应的开发人员的成本是,如果你做错了,那么你可以处理内存损坏错误,这些错误格式化你的硬盘并在一小时后崩溃你的进程,而不是在错误发生时处理一个很好的清理异常。

理论上可以使用指针而不会失去托管环境的任何优势吗?

通过“优势”,我认为你的意思是垃圾收集,类型安全和参照完整性等优点。因此,您的问题基本上是“理论上可以关闭安全系统,但仍然可以获得安全系统开启的好处吗?” 不,显然不是。如果关闭该安全系统,因为不喜欢它的价格昂贵,那么不会从中受益!

用户回答回答于

指针是被管理的,垃圾收集的环境的内在矛盾。 一旦你开始搞乱原始指针,GC就不知道发生了什么。

具体而言,它不能分辨对象是否可达,因为它不知道指针的位置。 它也不能在内存中移动对象,因为这会破坏你的指针。

所有这些都可以通过GC跟踪的指针来解决; 这就是参考。

应该只在凌乱的高级互操作场景中使用指针或者进行高度复杂的优化。 如果你不得不问,你可能不应该。

扫码关注云+社区