13

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

4

4 回答 4

12

是的。当不安全的时候,所有的赌注都被取消了。

这是“不安全”背后的想法 - 可验证类型的“安全性”被删除,并且您可以从一种类型的指针转​​换为另一种类型的指针,而运行时不会阻止您在脚上开枪,如果您如此渴望 - 很像 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[],但是在我得到 a 之后,Byte*我可以将它转换为Int64*一次并使用 8 个字节。

于 2010-07-03T22:05:29.210 回答
3

是的,这一切皆有可能。这是来自 MSDN的不安全代码教程。

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

于 2010-07-03T22:12:29.670 回答
1

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

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

于 2010-07-03T22:09:55.337 回答
0

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

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

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

于 2010-07-03T22:11:51.467 回答