在循环内部或外部使用不安全有什么区别?

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

我找不到任何其他文档,但我想更好地了解不安全的作品,以及如果它在循环内部或外部使用它有什么区别。

这样做更好吗?

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关键字是用来告诉编译器你知道自己在做什么的标记。 它的主要目的类似于logging你的代码: unsafe块显示你指定为非托pipe领域的部分代码; 对代码的实际执行没有影响。

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

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

unsafe更改编译器将接受并产生输出的expression式。 它本身并没有运行时开销。 对于任何不需要unsafeexpression式,编译器会发出相同的代码,而不unsafe是否在unsafe上下文中。

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