C# 中的不安全代码

Posted

技术标签:

【中文标题】C# 中的不安全代码【英文标题】:Unsafe code in C# 【发布时间】:2011-03-11 12:31:58 【问题描述】:

C# 中不安全代码的限制是什么?例如,我可以像使用 C 或 C++ 一样进行几乎任意的指针转换和算术运算吗?

【问题讨论】:

【参考方案1】:

是的。 All bets are off 当 unsafe 出现时。

这就是“不安全”背后的想法——可验证类型的“安全性”被移除了,您可以从一种类型的指针转​​换为另一种类型的指针,而运行时不会阻止您使用shooting yourself in the foot,如果你如此渴望 - 很像 C 或 C++。

这是在 C# 中使用不同指针类型的示例:

fixed (Byte* dstBytes = &currentImage[0])

    var dstBuffer = (Int64*)dstBytes;
    const int blockCount = ImageSizeInBytes / sizeof(Int64);

    for (var j = 0; j < blockCount; j++)
    
        dstBuffer[j] = srcBuffer[j];
    

注意数组的类型是Byte[],但是在我得到Byte* 之后,我可以将它转换为Int64* 并一次处理8 个字节。

【讨论】:

【参考方案2】:

是的,这一切皆有可能。这是来自 MSDN 的 Unsafe Code Tutorial。

对于那些说使用它是一个可怕的想法的人:是的,但它的存在是有原因的。我最近不得不(第一次)使用它,通过返回 Byte * 的第三方 API 获取网络摄像头数据。

【讨论】:

【参考方案3】:

是的,你可以在任何你喜欢的地方做一个指针。

但是,由于您的程序在虚拟地址空间中运行,因此您只能访问该空间中实际存在的内存,即您无法访问任何其他进程,并且您无法访问尚未访问的内存已分配。

【讨论】:

【参考方案4】:

您可以参考以下页面了解更多信息:

http://msdn.microsoft.com/en-us/library/y31yhkeb.aspx

不安全代码提供了为几乎任何原始变量(基本类型)声明指针的能力;您可以在指针类型之间进行转换。指针运算是基于指针类型的存储大小,所以对指针应用后自增或后自减都会将地址增加 sizeof(type)。

【讨论】:

以上是关于C# 中的不安全代码的主要内容,如果未能解决你的问题,请参考以下文章

真正的不安全代码性能

TypeScript 中泛型的不安全隐式转换

即使在 project.json 中将 allowunsafe 标志设置为 true 后,.NET Core 中的不安全代码编译错误

提高速度的不安全 C# 技巧

C# 一个列表中的不同类对象

Java map / nio / NFS 问题导致 VM 故障:“在最近编译的 Java 代码中的不安全内存访问操作中发生故障”