我过去从不需要使用不安全的东西,但现在我需要它来处理操作位图的指针。
我找不到任何其他方面的文件,但我想更好地了解不安全是如何工作的,如果在循环内外使用它会有什么不同。
做得更好:
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.
}
}
}
答案 0 :(得分:55)
unsafe
关键字是一个标记,用于告诉编译器您知道自己在做什么。其主要目的与记录代码类似:unsafe
块显示您指定为非托管区域的部分代码;对代码的实际执行没有影响。
考虑到这一点,尽可能减少这个不安全区域的大小是有意义的,这意味着你的第二种方法比第一种方法更好。
值得一提的是,另外两个替代方案,即标记方法和使用unsafe
标记类,也不如在安全块放置在代码的最小可能部分周围时的方法。
答案 1 :(得分:37)
unsafe
更改编译器将接受并为其生成输出的表达式。它本身不会产生运行时开销。对于任何不需要unsafe
的表达式,编译器将发出相同的代码,无论它是否在unsafe
上下文中。
对于 表达式只能在unsafe
上下文中使用的细节,我建议参考C# Language Specification