在 C# 中,不安全代码的限制是什么?例如,我能否像使用 C 或 C++ 一样进行几乎任意的指针转换和算术操作?
是的。当存在不安全因素时,一切皆有可能。
"不安全"的概念就在于去除了可验证类型的“安全性”,如果你愿意,你可以将一个指针从一种类型转换为另一种类型,而运行时不会阻止你自我毁灭, 就像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个字节。是的,你可以让指针指向任何你想要的地方。
然而,由于你的程序运行在虚拟地址空间中,你只能访问实际存在于该空间中的内存,也就是说你不能访问其他进程的内存,也不能访问未被分配的内存。
http://msdn.microsoft.com/en-us/library/y31yhkeb.aspx
不安全代码提供了为几乎任何基本变量(基本类型)声明指针的能力;允许在指针类型之间进行强制类型转换。指针算术基于指针类型的存储大小,因此对指针应用后增量或后减量将使地址增加 sizeof(type)。