header

■安全でないコード unsafe, ポインタ

C#は、C,C++のようにポインタを扱えません。
その代わりに参照やガベージコレクタの機能を持っており
その恩恵を受けて安全に動作するコードを記述することができます。

しかしながら、unsafeキーワードを使うと
C#でもポインタを扱うような
安全でないコードを記述することが可能になります。

以下にポインタを扱うC#のサンプルコードを示します。

【ポインタを扱うC#のサンプルコード】
    using System;

    namespace anzendenai
    {
        class Class1
        {
            unsafe static void Main(string[] args)
            {
                int a = 1;
                Init(&a);
                Console.WriteLine(a);
            }

            unsafe static void Init(int *p)
            {
                *p = 0;
            }
        }
    }
【実行結果】
    0
【補足】
    unsafeなコードをコンパイルする場合は
    /unsafeコンパイルオプションを有効にしてコンパイルしてください。
    (そうしなければコンパイルエラーとなります)

    VisualStudio2003の場合は
    プロジェクトのプロパティーを開いて@todo
実行結果からもわかるように、 Init関数の引数はint型のポインタです。 そして関数内でポインタが指す変数の値を0に書き換えています。 このように、 ポインタを扱うような安全でないコードを書く場合は 安全でないコードを実行する関数の頭に unsafe修飾子を付けます。 或いは、次に示すように 関数全体をunsafeにするのではなく 安全でないコードを実行する場所が限定的であるならば unsafeブロックでその場所を囲むこともできます。
【unsafeブロックで囲む記述例】
    using System;

    namespace anzendenai
    {
        class Class1
        {
            static void Main(string[] args)
            {
                int a = 1;

                // 安全でないコードを実行する部分をunsafeブロックで囲む
                unsafe
                {
                    Init(&a);
                }

                Console.WriteLine(a);
            }

            unsafe static void Init(int *p)
            {
                *p = 0;
            }
        }
    }
■値型のサイズを取得 sizeof
sizeof演算子を使うと 値型のサイズを取得することが可能です。
【書式】
    sizeof(値型名)
例として、 int型のサイズを取得し、表示するコードを示します。
【int型のサイズを取得して表示するコード】
    Console.WriteLine(sizeof(int));
文法的にはこれで正しいのですが このコードをコンパイルすると コンパイルエラーとなります。 sizeof演算子は、 unsafe(安全でないコード)でのみ利用可能です。 書き直したものを以下に示します。
【int型のサイズを取得して表示するコード】
    unsafe
    {
        Console.WriteLine(sizeof(int));
    }
【実行結果】 4 また、.NETには 値型変数のサイズを取得する方法があります。
【値型変数のサイズを取得して表示するコード】
    int a = 1;
    Console.WriteLine(System.Runtime.InteropServices.Marshal.SizeOf(a));
【実行結果】
    4
なお、どちらの方法も 構造体のサイズを取得する際にも利用可能です。




Copyright © 2008.07 - shougo suzaki