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

2024-03-11

我知道 C# 使程序员能够在不安全的上下文中访问和使用指针。但是什么时候需要这个呢?

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

仅仅是出于性能原因吗?

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


什么时候需要这个?在什么情况下不可避免地需要使用指针?

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

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

仅仅是出于性能原因吗?

出于性能以外的原因在托管语言中使用指针似乎是有悖常理的。

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

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

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

这些管理优势伴随着性能成本。例如,每次向数组询问其第十个元素时,运行时都需要检查是否存在第十个元素,如果不存在则抛出异常。使用指针可以消除运行时成本。

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

从理论上讲,是否可以使用指针而不失去托管环境的任何优势?

我认为“优点”指的是垃圾收集、类型安全和引用完整性等优点。因此,您的问题本质上是“理论上是否可以关闭安全系统,但仍然可以获得安全系统打开的好处?”不,显然不是。如果你因为不喜欢它的昂贵而关闭该安全系统,那么你就无法享受到它开启带来的好处!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

何时在 C#/.NET 中使用指针? 的相关文章

随机推荐

  • 在 Linux 上以汇编形式输出整数

    这需要在纯汇编中完成 即没有库或对 C 的调用 我理解问题的本质 需要将整数除以 10 将一位数余数转换为 ASCII 输出 然后用商重复该过程 但由于某种原因 它不起作用 我在 x86 上使用 NASM 这是我到目前为止所拥有的 不输出任
  • UICollectionView 的单元格消失

    发生了什么 目前我有一个应用程序使用两个UICollectionViews里面一个UITableView 通过这种方式 我创建了一个看起来像 Pulse News 的应用程序 我的问题是 有时第 6 行和第 11 行完全消失 在本应是单元格
  • 我想通过 graph api 分享朋友的帖子

    我想通过 graph api 在 facebook 上分享一些帖子 但是没有这样的api 只有 饲料 存在 我尝试使用 me feed 图形 API 操作来分享我朋友的帖子 以及页面中的帖子 但它和我在 Facebook 网站上分享的不一样
  • 开发 BlackBerry OS6 需要哪个版本的 Blackberry JRE

    我下载了适用于 BlackBerry 的 Eclipse 插件 默认情况下具有 BlackBerry OS 7 运行时 我需要定位 BlackBerry OS 6 和 OS 7 设备 这也适用于 BlackBerry OS 6 还是我需要更
  • 加快我的批处理文件解析速度

    我有一个批处理文件 它从一个 txt 文件中获取输入 如下所示 Microsoft R Windows Script Host Version 5 8 Copyright C Microsoft Corporation All rights
  • System.String[] Split(Char[])' 方法无法识别

    我有以下数据 我想使用 Linq to Entities 过滤数据 但我收到异常 LINQ to Entities 无法识别方法 System String Split Char 方法 并且该方法不能翻译为 存储表达式 我的表中有以下数据
  • 为因子的每个级别附加一行总和

    我想为每个 Reg 添加一行总和 如下所示 Reg Res Pop 1 Total 1000915 2 A Urban 500414 3 A Rural 500501 4 Total 999938 5 B Urban 499922 6 B
  • UIPageViewController 在旋转时重置为第一页

    当用户旋转设备时 UIPageViewController从它显示的任何页面淡出回到第一页 这确实很烦人 尤其是当用户进入文档的多个页面时 它仅出现在 iOS 6 中 当用户旋转设备时 spineLocationForInterfaceOr
  • 如何分析Delphi应用程序中过多的内存消耗(PageFileUsage)?

    这是这个问题的后续 如何解释 FastMM 或 GetProcessMemoryInfo 报告的内存使用情况的差异 https stackoverflow com q 9704786 184404 我的 Delphi XE 应用程序使用大量
  • Visual Studio 大型解决方案

    我已经为我的 Web 应用程序提供了一个解决方案 其中包含近 12 个项目和 3 个网站 有一些项目用于多个网站 例如 MyProject BE MyProject BLL MyProject DAL MyProject Controls
  • 如何在程序中向scrapy爬虫传递参数?

    我是 python 和 scrapy 的新手 我用的是这个博客的方法以编程方式运行多个 scrapy 蜘蛛 http kirankoduru github io python multiple scrapy spiders html在烧瓶应
  • 设置目录的访问权限 - 接收异常“无法设置标志”

    我正在尝试编程允许对目录上的 ASPNET 帐户进行写访问 我使用以下代码来执行此操作 请注意 我希望 ASPNET 的 允许写入访问权限 也传播到子对象 static void Main string args FileSecurity
  • 我们可以依靠减少容量的技巧吗?

    它真的能保证以下减少容量的技巧在任何地方都能 起作用 吗 int main std string s lololololol s capacity still non zero string s swap s 它似乎对我来说 不起作用 因为
  • Hibernate 错误 - QuerySyntaxException:用户未映射 [来自用户]

    我试图从 用户 表中获取所有用户的列表 但出现以下错误 org hibernate hql internal ast QuerySyntaxException users is not mapped from users org hiber
  • Workbooks.OpenText 忽略 FieldInfo 列参数

    我有以下行来导入 csv 格式文件 Workbooks OpenText Filename sPath DataType xlDelimited Comma True FieldInfo Array Array 18 5 Array 19
  • 是否有任何 C 库为 GNU/Linux 实现 C11 线程?

    曾经有过a lot关于 C11 和 C11 线程的问题 但我在任何地方都没有看到明确的答案 Does anyC 库实现了可在 GNU Linux 上使用的 C11 线程接口吗 例如 提供 可选
  • 如何通过代码阅读所有共享的谷歌阅读器提要?

    我在我的谷歌阅读器上分享了很多提要 我想要一些使用 asp net 的代码来读取所有这些提要并放入页面中 可能需要分页 因为提要太多 有人知道该怎么做吗 或者是否有一个工具可以做到这一点 您可以使用RSS工具包 http blogs msd
  • 创建和删除索引后 MySQL 性能提升

    我有一个大型 MySQL MyISAM 表 大约有 400 万行 在 core 2 duo 8G RAM 笔记本电脑上运行 该表有 30 列 包括 varchar decimal 和 int 类型 我在 varchar 16 上有一个索引
  • 使用 jQuery 中的正则表达式验证电子邮件[重复]

    这个问题在这里已经有答案了 参考这个问题 如何使用 jQuery 设置字段的最小长度 https stackoverflow com questions 9571483 how can i set a minimum length for
  • 何时在 C#/.NET 中使用指针?

    我知道 C 使程序员能够在不安全的上下文中访问和使用指针 但是什么时候需要这个呢 在什么情况下 使用指针变得不可避免 仅仅是出于性能原因吗 另外 为什么 C 通过不安全的上下文公开此功能 并从中删除所有托管优势 从理论上讲 是否可以使用指针