今回は、C++のコードをC#のunsafe
(アンセーフ)コードを使って記述する方法を解説していきます。
C++のポインターとは?
プログラムで実行するときの変数の値はメモリ上に保持されます。
メモリには値を格納する領域があり、それぞれの場所を示すアドレスという住所録のようなものがあります。
そのアドレスを格納するのに使われるのがC++に代表される「ポインター」。
ポインターには、メモリ上の自由なアドレスにアクセスできる利点があって、自由度が高く上手く扱えばプログラムのパフォーマンスを最大化することができます。
しかし、自由度が高い分、不正なメモリアクセスやオーバーフローといったバグが発生しやすいのも特徴になります。
C#はポインターの概念がない
ポインターを使うことでバグを生むリスクもあることから、C#ではC++のポインターの利用が制限されています。
ポインターの代替えみたいなものを用意して、必要最低限の機能に絞って提供することで、C#では堅牢性と生産性を上げたプログラミング環境を用意しているのです。
unsafeコード
C#ではunsafe
コードを使うことで、C++のようなポインターを制限付きで使うことが使うことができます。
C#でunsafeコードを使うための準備
C#でunsafe
コードを使うためには、プロジェクトのプロパティ
→ビルド
でアンセーフコード
の許可にチェックを入れる必要があります。
unsafeコードを使ってみる
準備ができたらunsafe
コードを使っていきましょう。
以下のように、関数にunsafe
を付けたり、関数内にunsafe
ブロックで囲うことで使うことができます。
unsafe void UnsafeMethod()
{
// 関数自体をアンセーフ化
// ポインターが使用可能。
}
void SafeMethod()
{
// ポインターは使用できない領域
unsafe
{
// このブロック内をアンセーフ化
// ブロック内はポインターが使用可能。
}
}
サンプルコード
using System;
namespace PointerTest
{
class Program
{
static void Main(string[] args)
{
unsafe
{
byte* p; // ポインターの宣言
byte n = 0x30;
Console.WriteLine("代入前のnの値:{0}", n);
p = &n; // ポインター p に n のアドレスを代入
*p = 0xff; // p の参照先 (n) の値を 0xff に書き換える
Console.WriteLine("代入後のnの値:{0}", n);
}
}
}
}
実行結果
代入前のnの値:48
代入後のnの値:255
しっかりポインターを使った値の入れ替えができました。
コメント