我知道 C# 使程序员能够在不安全的上下文中访问和使用指针。但是什么时候需要这个呢?
在什么情况下,使用指针变得不可避免?
仅仅是出于性能原因吗?
另外,为什么 C# 通过不安全的上下文公开此功能,并从中删除所有托管优势?从理论上讲,是否可以使用指针而不失去托管环境的任何优势?
什么时候需要这个?在什么情况下不可避免地需要使用指针?
当受管理的安全解决方案的净成本不可接受但不安全解决方案的净成本可接受时。您可以通过从总成本中减去总收益来确定净成本或净收益。不安全解决方案的好处是“不会浪费时间在不必要的运行时检查上以确保正确性”;成本是(1)即使在托管安全系统关闭的情况下也必须编写安全的代码,以及(2)必须处理可能导致垃圾收集器效率降低的问题,因为它无法在具有非托管指针的内存中移动它。
或者,如果您是编写编组层的人。
仅仅是出于性能原因吗?
出于性能以外的原因在托管语言中使用指针似乎是有悖常理的。
在绝大多数情况下,您可以使用 Marshal 类中的方法来处理与非托管代码的互操作。 (可能在某些情况下很难或不可能使用编组设备来解决互操作问题,但我不知道有什么情况。)
当然,正如我所说,如果您是编写 Marshal 类的人,那么显然您不会use编组层来解决您的问题。在这种情况下,您需要使用指针来实现它。
为什么 C# 通过不安全的上下文公开此功能,并从中删除所有托管优势?
这些管理优势伴随着性能成本。例如,每次向数组询问其第十个元素时,运行时都需要检查是否存在第十个元素,如果不存在则抛出异常。使用指针可以消除运行时成本。
相应的开发人员成本是,如果你做错了,那么你就得处理内存损坏错误,这些错误会格式化你的硬盘并在一小时后使你的进程崩溃,而不是在错误发生时处理一个干净的异常。
从理论上讲,是否可以使用指针而不失去托管环境的任何优势?
我认为“优点”指的是垃圾收集、类型安全和引用完整性等优点。因此,您的问题本质上是“理论上是否可以关闭安全系统,但仍然可以获得安全系统打开的好处?”不,显然不是。如果你因为不喜欢它的昂贵而关闭该安全系统,那么你就无法享受到它开启带来的好处!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)