C#中的不安全代码

时间:2010-07-03 22:03:27

标签: c# unsafe

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

4 个答案:

答案 0 :(得分:11)

是。 All bets are off当发生不安全时。{/ p>

这是“不安全”背后的想法 - 可以删除可验证类型的“安全性”,并且可以从一种类型的指针强制转换为另一种类型的指针,而运行时不会使您远离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个字节。

答案 1 :(得分:3)

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

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

答案 2 :(得分:1)

是的,你可以在任何你喜欢的地方指点。

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

答案 3 :(得分:0)

有关详细信息,请参阅以下页面:

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

不安全代码提供了为几乎任何原始变量(基本类型)声明指针的功能;你被允许在指针类型之间转换。指针算法基于指针类型的存储大小,因此将后递增或后递减应用于指针将增加sizeof(type)的地址。