安全与不安全的代码

时间:2010-05-03 20:17:08

标签: c# unsafe

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

4 个答案:

答案 0 :(得分:23)

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

  • API(约翰指出)
  • 获取数据的实际内存地址(例如,访问内存映射硬件)
  • 访问和修改数据的最有效方式(时间要求严格的性能要求)

答案 1 :(得分:5)

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

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

答案 2 :(得分:4)

我倾向于避免它,但有时候它会非常有用:

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

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

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

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

答案 3 :(得分:0)

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

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