Latest web development tutorials

C#の安全でないコード

コードのブロックは、安全でない修飾子タグを使用する場合は、C#のは、関数内のポインタ変数を使用することができます。安全でないコードまたはアンマネージコードは、コードブロックのポインタ変数を使用することです。

ポインター変数

ポインタは 、すなわち、メモリ位置の直接アドレス別の変数のアドレスの変数の値です。他の変数または定数と同じように、あなたは他の変数記憶アドレスポインタの宣言の前にポインタを使用する必要があります。

ポインタ変数宣言の一般的な形式は次のとおりです。

型*のVAR-名。

以下は、有効なポインタの宣言です:

int型* IP; / *ポイント整数に* /
ダブル* DP;倍精度数へ/ *ポインタ* /
* fpのフロート; / *ポインタをフロート*に/
char型へのchar * CH / *ポインタ* /

次の例では、ときにポインタ危険な修飾子を使ってC#の使用方法を示しています。

システムを用いました。
名前空間UnsafeCodeApplication
{
    クラスプログラム
    {
        静的危険な無効メイン(文字列[] args)
        {
            int型VAR = 20;
            int型* P =&VAR;
            Console.WriteLineを( "データがある:{0}"、VAR)。
            Console.WriteLineを( "アドレスは次のとおりです。{0}"、(int型)P);
            Console.ReadKey()。
        }
    }
}

上記のコードはコンパイルされ、実行されると、次の結果を生成します。

データは次のとおりです。20
アドレスは次のとおりです。99215364

あなたは、安全でないコードとして安全でないコードとしてメソッドを宣言する必要性の一部だけをメソッド全体を宣言することはできません。 次の例では、この点を示しています。

ポインタを使用してデータ値を取得します

あなたは、検索ポインタ変数に格納された基準位置データのtoString()メソッドを使用することができます。 次の例では、この点を示しています。

システムを用いました。
名前空間UnsafeCodeApplication
{
   クラスプログラム
   {
      公共の静的な無効メイン()
      {
         危険な
         {
            int型VAR = 20;
            int型* P =&VAR;
            Console.WriteLineを( "データがある:{0}"、VAR)。
            Console.WriteLineを( "データです:{0}"、p型>のToString());
            Console.WriteLineを( "アドレスは次のとおりです。{0}"、(int型)P);
         }
         Console.ReadKey()。
      }
   }
}

上記のコードはコンパイルされ、実行されると、次の結果を生成します。

データは次のとおりです。20
データは次のとおりです。20
アドレスは次のとおりです。77128984

パラメータ法としてポインタを渡します

あなたはアプローチのメソッドにパラメータとしてポインタ変数を渡すことができます。 次の例では、この点を示しています。

システムを用いました。
名前空間UnsafeCodeApplication
{
   クラスTestPointer
   {
      公共の危険なボイドスワップ(int型* pを、int型* Q)
      {
         int型の温度= * P;
         * P = * Q;
         * Q =一時;
      }

      公共の安全でない静的な無効メイン()
      {
         TestPointer P =新しいTestPointer();
         int型VAR1 = 10;
         int型var2の= 20;
         int型* X =&VAR1;
         int型* Y =&var2の。
         
         Console.WriteLineを( "スワップ前:VAR1:{0}、var2の:{1}"、VAR1、VAR2)。
         p.swap(X、Y)

         Console.WriteLineを( "スワップ後:VAR1:{0}、var2の:{1}"、VAR1、VAR2)。
         Console.ReadKey()。
      }
   }
}

上記のコードはコンパイルされ、実行されると、次の結果を生成します。

VAR1:スワップする前に10、VAR2:20
VAR1:スワップ後20、VAR2:10

配列要素にアクセスするためのポインタを使用

C#では、配列名と同じデータ型を持つ配列データへのポインタが別の変数の型へのポインタです。 例えば、int型* pとint型は、[] pが異なるタイプです。 あなたは、配列pを追加することはできませんので、あなたは、それがメモリに固定されていないので、ポインタ変数pを増やすことができますが、配列のアドレスをメモリに固定されています。

だから、あなたは私たちが通常、固定された固定ポインタを使用するには、キーワードとして、CまたはC ++でそうであるように、配列データにアクセスするためのポインタ変数を使用する必要がある場合。

次の例では、この点を示しています。

システムを用いました。
名前空間UnsafeCodeApplication
{
   クラスTestPointer
   {
      公共の安全でない静的な無効メイン()
      {
         int型[]リスト= {10、100、200};
         固定(int型* PTR =リスト)

         / *ディスプレイポインタ配列アドレス* /
         以下のために(; iは3 <; I = 0 int型私は++)
         {
            Console.WriteLineを( "リストのアドレス[{0}] = {1}"、私、(int型)(PTR + I));
            Console.WriteLineを( "リストの値[{0}] = {1}"、私、*(ptrが+ I));
         }
         Console.ReadKey()。
      }
   }
}

上記のコードはコンパイルされ、実行されると、次の結果を生成します。

リストのアドレス[0] = 31627168
リストの値は[0] = 10
リストのアドレス[1] = 31627172
リストの値が[1] = 100
リストのアドレス[2] = 31627176
リストの値[2] = 200

安全でないコードをコンパイルします

安全でないコードをコンパイルするためには、/危険なコマンドラインを指定してコマンドラインコンパイラに切り替える必要があります。

例えば、prog1.csが安全でないコードが含まれていると呼ばれるプログラムをコンパイルするには、コマンドラインでコマンドを入力します。

CSC /危険なprog1.cs

あなたは、Visual Studio IDEを使用している場合は、プロジェクトのプロパティで安全でないコードを有効にする必要があります。

以下のように実行します。

  • ダブルクリックするエクスプローラ(ソリューションエクスプローラ)は属性(プロパティ)ノードでは、プロジェクトのプロパティ(プロジェクトのプロパティ)を開きます。
  • [ビルド]タブをクリックします。
  • 「安全でないコードを許可」オプションを選択します。