我知道C#让程序员能够在不安全的环境中访问、使用指针.但什么时候需要?

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

这只是出于性能原因吗?

还有,为什么C#会通过一个不安全的环境公开这个功能,并从中移除所有托管优势?从理论上讲,有没有可能在不失go 托管环境任何优势的情况下使用指针?

推荐答案

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

当托管安全解决方案的净成本不可接受,但不安全解决方案的净成本可接受时.你可以通过从总成本中减go 总yield 来确定净成本或净yield .不安全解决方案的好处是"没有时间浪费在不必要的运行时判断上,以确保正确性";代价是(1)即使在托管安全系统关闭的情况下,也必须编写安全的代码;(2)必须处理可能降低垃圾收集器效率的问题,因为它无法在内存中移动,而内存中有一个非托管指针.

或者,如果您是编写编组层的人.

这只是出于性能原因吗?

在托管语言中使用指针似乎是出于性能以外的原因.

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

当然,正如我所说的,如果你是编写封送类的人,那么很明显,你不能通过封送层来解决你的问题.在这种情况下,您需要使用指针来实现它.

为什么C#要通过一个不安全的环境公开这个功能,并从中移除所有托管优势?

这些管理优势伴随着性能成本.例如,每次您向数组请求第十个元素时,运行时都需要判断是否有第十个元素,如果没有,则抛出一个异常.通过指针,运行时成本被消除.

相应的开发人员成本是,如果你做错了,那么你就要处理格式化硬盘并在一小时后使进程崩溃的内存损坏错误,而不是在出现错误时处理一个干净的异常.

从理论上讲,有可能在不损失托管环境任何优势的情况下使用指针吗?

我想你说的"优势"是指垃圾收集、类型安全和引用完整性等优势.因此,你的问题本质上是"从理论上讲,是否有可能关闭安全系统,但仍能获得打开安全系统的好处?"不,显然不是.如果你因为不喜欢它的昂贵而关闭了安全系统,那么你就得不到它的好处!

.net相关问答推荐

使用React路由加载器获取数据不能正常工作

通过 System.Net.Mail 的 VB SMTP 停止工作

如何将 Assembly.CodeBase 转换为 C# 中的文件系统路径?

使用字典作为数据源绑定组合框

HttpClient 请求抛出 IOException

将 BitmapImage 转换为 Bitmap,反之亦然

如何在 C# 中打开 Excel 文件?

.Net 中的 Int128?

哪个更快:清除集合或实例化新的

如何根据默认样式创建样式?

如何在 RabbitMQ 中设置重试次数?

beforefieldinit 标志有什么作用?

log4net的正确使用方法(记录器命名)

从 C# 中的字符串中删除最后一个字符.优雅的方式?

更改 SqlConnection 超时

如何向 C# Winforms 中的标签添加提示或工具提示?

DateTime.Compare 如何判断日期是否小于 30 天?

在 WPF 中设置 Tab 键顺序

有没有一种简单的方法来判断 .NET Framework 版本?

Roslyn 编译代码失败