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(値型名)
例として、
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
なお、どちらの方法も
構造体のサイズを取得する際にも利用可能です。