web-dev-qa-db-ja.com

ループの内側または外側で安全でないものを使用することに違いはありますか?

以前は安全でないものを使用する必要はありませんでしたが、ビットマップを操作するポインターを操作するために必要になりました。

それ以外のことを示すドキュメントは見つかりませんでしたが、安全でないことがどのように機能するか、ループの内側または外側で使用することに違いがあるかどうかをよりよく理解したいと思います。

行う方が良いですか:

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.
        }
    }
}
65
Dzyann

unsafeキーワードは、自分が何をしているかを知っていることをコンパイラーに伝えるために使用するマーカーです。その主な目的は、コードの文書化に似ています。unsafeブロックは、管理されていない領域として指定したコードの一部を表示します。コードの実際の実行には影響はありません。

これを念頭に置いて、この危険な領域のサイズを可能な限り縮小することは理にかなっています。つまり、2番目のアプローチが最初のアプローチよりも優れていることを意味します。

他の2つの選択肢、つまりメソッドをマークすることとクラスをunsafeでマークすることも、安全でないブロックがコードの可能な限り小さい部分の周りに配置されている場合のアプローチよりも劣っていることに言及する価値があります。

55
dasblinkenlight

unsafeは、コンパイラがacceptする式を変更し、の出力を生成します。それ自体は、実行時のオーバーヘッドを課しません。 unsafeを必要としない式の場合、コンパイラーは、unsafeコンテキスト内であるかどうかに関係なく、同じコードを出力します。

which式の詳細については、unsafeコンテキスト内でのみ使用できます。 C#のセクション18を参照することをお勧めします。言語仕様

37