在循环内部或外部使用不安全是否有任何区别?

时间:2016-01-22 14:06:51

标签: c# 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.
        }
    }
}

2 个答案:

答案 0 :(得分:55)

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

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

值得一提的是,另外两个替代方案,即标记方法和使用unsafe标记类,也不如在安全块放置在代码的最小可能部分周围时的方法。

答案 1 :(得分:37)

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

对于 表达式只能在unsafe上下文中使用的细节,我建议参考C# Language Specification

的第18节