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

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

这只是出于性能原因吗?

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

推荐答案

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

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

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

这只是出于性能原因吗?

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

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

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

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

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

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

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

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

.net相关问答推荐

实体框架核心:Azure容器应用程序的执行超时已过期

如何使用AWS Lambda函数制作网络挂钩?

cmd 冻结中的 dotnet 命令.怎么了?

.NET 4.5 项目未在 Visual Studio 2022 中编译

使用 SSH.NET 查找具有特定文件名的最新 SFTP 文件

既然 .NET 有一个垃圾收集器,为什么我们需要终结器/析构器/dispose-pattern?

我应该创建一个 DateRange 对象吗?

从 switch 块中跳出 foreach 循环

.NET 应用程序的链接器状态(又名请先生,我可以有一个链接器2009 年版)

在 WinForms 应用程序中查找焦点控件的首选方法是什么?

我应该从 .NET 中的 Exception 或 ApplicationException 派生自定义异常吗?

如何使用 NUnit(或可能使用另一个框架)测试异步方法?

操作对事务的状态无效错误和事务范围

如何将时间设置为当天的午夜?

ToLowerInvariant() 有什么问题?

String.Join 与 StringBuilder:哪个更快?

安装带有恢复操作的 Windows 服务以重新启动

是否可以判断对象是否已附加到实体框架中的数据上下文?

IronPython 与 Python .NET

Linq Query 不断抛出无法创建 System.Object 类型的常量值......,为什么?