以前は安全でないものを使用する必要はありませんでしたが、ビットマップを操作するポインターを操作するために必要になりました。
それ以外のことを示すドキュメントは見つかりませんでしたが、安全でないことがどのように機能するか、ループの内側または外側で使用することに違いがあるかどうかをよりよく理解したいと思います。
行う方が良いですか:
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
ブロックは、管理されていない領域として指定したコードの一部を表示します。コードの実際の実行には影響はありません。
これを念頭に置いて、この危険な領域のサイズを可能な限り縮小することは理にかなっています。つまり、2番目のアプローチが最初のアプローチよりも優れていることを意味します。
他の2つの選択肢、つまりメソッドをマークすることとクラスをunsafe
でマークすることも、安全でないブロックがコードの可能な限り小さい部分の周りに配置されている場合のアプローチよりも劣っていることに言及する価値があります。
unsafe
は、コンパイラがacceptする式を変更し、の出力を生成します。それ自体は、実行時のオーバーヘッドを課しません。 unsafe
を必要としない式の場合、コンパイラーは、unsafe
コンテキスト内であるかどうかに関係なく、同じコードを出力します。
which式の詳細については、unsafe
コンテキスト内でのみ使用できます。 C#のセクション18を参照することをお勧めします。言語仕様