在循环内部或外部使用 unsafe 有什么区别吗?

Does it make any difference to use unsafe inside or outside a loop?

过去我从来不需要使用 unsafe,但现在我需要它来处理位图的指针。

我找不到任何其他说明的文档,但我想更好地了解 unsafe 的工作原理,以及在循环内或循环外使用它是否有任何区别。

这样做比较好:

unsafe
{
    for (int x = 0; x < maxX; x++)
    {
        for (int y = 0; y < maxY; y++)
        {           
            //Unsafe pointer operations here.
        }
    }
}

还是要做?:

for (int x = 0; x < maxX; x++)
{
    for (int y = 0; y < maxY; y++)
    {   
        unsafe
        {       
            //Unsafe pointer operations here.
        }
    }
}

unsafe 更改编译器将 接受 并为其生成输出的表达式。它本身不会产生任何运行时开销。对于任何不需要 unsafe 的表达式,无论是否在 unsafe 上下文中,编译器都会发出相同的代码。

关于 哪些 表达式只能在 unsafe 上下文中使用的细节,我建议查阅 C# Language Specification

unsafe 关键字是一个标记,用于告诉编译器您知道自己在做什么。它的主要目的类似于记录您的代码:unsafe 块显示您指定为非托管区域的部分代码;对代码的实际执行没有影响。

考虑到这一点,尽可能减小这个不安全区域的大小是有意义的,这意味着您的第二种方法比第一种方法更好。

值得一提的是,当不安全块放置在尽可能小的部分周围时,其他两种替代方法,即标记方法和标记 class 与 unsafe 的方法也不如代码。