Amazonでお得な買い物

【C#】C++のポインターをunsafe(アンセーフ)を使って記述する

C# アンセーフ unsafe

今回は、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

しっかりポインターを使った値の入れ替えができました。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

都内の精密機器を作っている会社に勤務している14年目のエンジニアです。趣味は美味しいものを食べることとゴルフ。プログラムについて今まで学んだことをわかりやすく発信するサイトを目指しています。

コメント

コメントする

目次