我过去从不需要使用不安全的东西,但是现在我需要它来处理一个操纵位图的指针.
我找不到任何其他方面的文档,但我想更好地理解不安全是如何工作的,如果在循环内部或外部使用它会有什么不同.
做得更好:
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节