我知道我必须使用 Unsafe Option 编译才能在 C# 中使用不安全代码考虑以下
static void foo()
{
int a = 5;
int* p = &a;
}
除非我将方法标记为不安全或将上述语句包装在不安全块中,否则上述代码将无法编译。
很好奇为什么编译器强迫我这样做?这背后有什么技术原因吗?
发现这篇文章有很好的详细解释 -
在 C 和 C++ 中,开发人员可以直接访问内存。当一段 C 或 C++ 代码请求访问一块内存时,它会获得分配内存的特定地址,并且代码直接读取和写入该内存位置。这种方法的优点是直接访问内存非常快,并且可以编写高效的代码。然而,有一些问题超过了好处。这种直接内存访问的问题是容易误用,误用内存会导致代码崩溃。行为不端的 C 或 C++ 代码可以轻松写入已删除的内存,或者可以写入属于另一个变量的内存。这些类型的内存访问问题会导致大量难以发现的错误和软件崩溃。
CLR 的体系结构通过为您处理内存管理消除了所有这些问题。这意味着您的 C# 代码可以使用变量,而无需了解有关变量在内存中的存储方式和位置的详细信息。由于 CLR 将您的 C# 代码与这些与内存相关的细节屏蔽开来,因此您的 C# 代码不会出现与直接访问内存相关的错误。
但是,有时您需要在 C# 代码中使用特定的内存地址。您的代码可能需要额外的性能,或者您的 C# 代码可能需要使用需要您提供特定内存地址的遗留代码。C# 语言支持一种特殊的模式,称为不安全模式,它使您能够在 C# 代码中直接使用内存。
这种特殊的 C# 构造称为不安全模式,因为您的代码不再安全,不受 CLR 提供的内存管理保护。在不安全模式下,您的 C# 代码可以直接访问内存,如果您对管理内存的方式不十分小心,它可能会遭受在 C 和 C++ 代码中发现的与内存相关的同一类错误。