安全与不安全的代码

今天阅读这个关于安全和不安全代码的问题我然后在MSDN中阅读它,但我仍然不理解它。 你为什么要在C#中使用指针? 这纯粹是为了速度吗?

使用不安全代码有三个原因:

  • API(如John所述)
  • 获取数据的实际内存地址(例如,访问内存映射硬件)
  • 访问和修改数据的最有效方式(时间关键性能要求)

有时您需要指针将C#连接到底层操作系统或其他本机代码。 你强烈反对这样做,因为它“不安全”(natch)。

在一些非常罕见的场合,你的性能是如此受CPU限制,你需要那么微小的额外性能。 我的建议是在汇编程序或C / C ++的单独模块中编写这些CPU-intessive部分,导出API,并让您的.NET代码调用该API。 一个可能的额外好处是,您可以将特定于平台的代码放在非托管模块中,并使.NET平台不可知。

我倾向于避免它,但有时候它非常有帮助:

  • 使用原始缓冲区(图形等)的性能
  • 一些非托管API需要(对我来说也很少见)
  • 用数据作弊

比如最后一个,我维护了一些序列化代码。 将float写入流而不必使用BitConverter.GetBytes (每次创建一个数组)是痛苦的 – 但我可以作弊:

 float f = ...; int i = *(int*)&f; 

现在我可以使用shift( >> )等来写i比写f更容易(如果我调用了BitConverter.GetBytes ,那么字节将是相同的,加上我现在通过我选择使用shift来控制字节序) 。

至少有一个托管的.Net API经常使用指针不可避免。 请参阅SecureString和Marshal.SecureStringToGlobalAllocUnicode 。

获取SecureString的纯文本值的唯一方法是使用Marshal方法之一将其复制到非托管内存。