-6

我知道我必须使用 Unsafe Option 编译才能在 C# 中使用不安全代码考虑以下

static void foo()
{
    int a = 5;
    int* p = &a;
}

除非我将方法标记为不安全或将上述语句包装在不安全块中,否则上述代码将无法编译。

很好奇为什么编译器强迫我这样做?这背后有什么技术原因吗?

4

2 回答 2

2

unsafe 关键字表示不安全的上下文,任何涉及指针的操作都需要它。

您可以在类型或成员的声明中使用 unsafe 修饰符。因此,类型或成员的整个文本范围被认为是不安全的上下文。

来自msdn

这里给出了一个很好的解释

于 2013-07-19T17:39:41.313 回答
2

发现这篇文章有很好的详细解释 -

在 C 和 C++ 中,开发人员可以直接访问内存。当一段 C 或 C++ 代码请求访问一块内存时,它会获得分配内存的特定地址,并且代码直接读取和写入该内存位置。这种方法的优点是直接访问内存非常快,并且可以编写高效的代码。然而,有一些问题超过了好处。这种直接内存访问的问题是容易误用,误用内存会导致代码崩溃。行为不端的 C 或 C++ 代码可以轻松写入已删除的内存,或者可以写入属于另一个变量的内存。这些类型的内存访问问题会导致大量难以发现的错误和软件崩溃。

CLR 的体系结构通过为您处理内存管理消除了所有这些问题。这意味着您的 C# 代码可以使用变量,而无需了解有关变量在内存中的存储方式和位置的详细信息。由于 CLR 将您的 C# 代码与这些与内存相关的细节屏蔽开来,因此您的 C# 代码不会出现与直接访问内存相关的错误。

但是,有时您需要在 C# 代码中使用特定的内存地址。您的代码可能需要额外的性能,或者您的 C# 代码可能需要使用需要您提供特定内存地址的遗留代码。C# 语言支持一种特殊的模式,称为不安全模式,它使您能够在 C# 代码中直接使用内存。

这种特殊的 C# 构造称为不安全模式,因为您的代码不再安全,不受 CLR 提供的内存管理保护。在不安全模式下,您的 C# 代码可以直接访问内存,如果您对管理内存的方式不十分小心,它可能会遭受在 C 和 C++ 代码中发现的与内存相关的同一类错误。

于 2013-07-19T17:59:23.847 回答