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

Dzy*_*ann 65 c# unsafe

我过去从不需要使用不安全的东西,但是现在我需要它来处理一个操纵位图的指针.

我找不到任何其他方面的文档,但我想更好地理解不安全是如何工作的,如果在循环内部或外部使用它会有什么不同.

做得更好:

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

还是做?:

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

das*_*ght 55

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

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

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


Dam*_*ver 37

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

对于哪些表达式只能在unsafe上下文中使用的细节,我建议参考C#语言规范的第18节

  • @Luaan不,它*不回答这个问题.SO和CR之间的问题是否存在边界?是.这是否意味着它不能在SO上?我不这么认为,但如果你这样做,你应该投票把它作为主题关闭.但问题的任何答案都必须回答这个问题,而事实并非如此.给出一个半答案并不是认为一个问题偏离主题的恰当回应; 投票移植它是. (9认同)
  • 并且对于不可避免的评论说这不能回答这个问题:尽管问题在StackOverflow上是偏离主题的,但这已经尽可能地回答了问题.@Dzyann如果你想要一个设计建议,而不仅仅是一个技术建议,试试CodeReview.SE. (4认同)
  • @KRyan - 它的目的是改变编译器将*接受*并为其生成输出.这实际上是我答案的第一句话. (2认同)