C#中的不安全代码有哪些限制?例如,我可以进行几乎任意的指针转换和算术运算,就好像我使用C或C ++一样吗?
答案 0 :(得分:11)
是。 All bets are off当发生不安全时。{/ p>
这是“不安全”背后的想法 - 可以删除可验证类型的“安全性”,并且可以从一种类型的指针强制转换为另一种类型的指针,而运行时不会使您远离shooting yourself in the foot ,如果你愿意 - 很像C或C ++。
以下是在C#中使用不同指针类型的示例:
fixed (Byte* dstBytes = ¤tImage[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)的地址。