在循环内部或外部使用 unsafe 有什么区别吗?
Does it make any difference to use unsafe inside or outside a loop?
过去我从来不需要使用 unsafe,但现在我需要它来处理位图的指针。
我找不到任何其他说明的文档,但我想更好地了解 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.
}
}
}
unsafe
更改编译器将 接受 并为其生成输出的表达式。它本身不会产生任何运行时开销。对于任何不需要 unsafe
的表达式,无论是否在 unsafe
上下文中,编译器都会发出相同的代码。
关于 哪些 表达式只能在 unsafe
上下文中使用的细节,我建议查阅 C# Language Specification
unsafe
关键字是一个标记,用于告诉编译器您知道自己在做什么。它的主要目的类似于记录您的代码:unsafe
块显示您指定为非托管区域的部分代码;对代码的实际执行没有影响。
考虑到这一点,尽可能减小这个不安全区域的大小是有意义的,这意味着您的第二种方法比第一种方法更好。
值得一提的是,当不安全块放置在尽可能小的部分周围时,其他两种替代方法,即标记方法和标记 class 与 unsafe
的方法也不如代码。
过去我从来不需要使用 unsafe,但现在我需要它来处理位图的指针。
我找不到任何其他说明的文档,但我想更好地了解 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.
}
}
}
unsafe
更改编译器将 接受 并为其生成输出的表达式。它本身不会产生任何运行时开销。对于任何不需要 unsafe
的表达式,无论是否在 unsafe
上下文中,编译器都会发出相同的代码。
关于 哪些 表达式只能在 unsafe
上下文中使用的细节,我建议查阅 C# Language Specification
unsafe
关键字是一个标记,用于告诉编译器您知道自己在做什么。它的主要目的类似于记录您的代码:unsafe
块显示您指定为非托管区域的部分代码;对代码的实际执行没有影响。
考虑到这一点,尽可能减小这个不安全区域的大小是有意义的,这意味着您的第二种方法比第一种方法更好。
值得一提的是,当不安全块放置在尽可能小的部分周围时,其他两种替代方法,即标记方法和标记 class 与 unsafe
的方法也不如代码。