最初に設定します。
プロジェクトを右クリックし、[生成]を選択して、[安全でないコードを許可する]をオンにします。
安全でないコードとは何かを説明します。
C#は管理言語であるため、メモリを自分で管理する必要はありません。参照、ホスティング、イベントなど、C / C ++のポインターを置き換えるメカニズムがいくつかあります。ただし、C#はJavaのようにポインターを完全に破棄しないため、ポインターはC#で引き続き使用できます。コードブロックで安全でない修飾子を使用する場合、C#では関数でポインター変数を使用できます。安全でないコードまたは管理されていないコードは、変数を使用するコードのブロックを指します。
安全でないコードを書くには、unsafeキーワードを使用します
ポインターの使用には関連するリスクが伴うため、C#では、特別にマークされたコードブロックでのみポインターを使用できます。コードをマークするために使用されるキーワードは安全ではありません。次のコードは、メソッドを安全でないものとしてマークします。
unsafe int GetSomeNumber()
{
//code that can use pointers
}
具体例:
例1:
using System;
namespace UnsafeCodeApplication
{
class Program
{
static unsafe void Main(string[] args)
{
int var = 20;
int* p = &var;
Console.WriteLine("Data is :{0}", var);
Console.WriteLine("Address is:{0}", (int)p);
Console.ReadKey();
}
}
}
演算結果:
例2:
/*使用指针检索数据值*/
using System;
namespace UnsafeCodeApplication
{
class Progarm
{
public static void Main()
{
unsafe
{
int var = 20;
int* p = &var;
Console.WriteLine("Data is:{0}", var);
Console.WriteLine("Data is:{0}", p->ToString());
Console.WriteLine("Address is:{0}", (int)p); //(int)p取得到p的地址
}
Console.ReadKey();
}
}
}
演算結果:
例3:
using System;
namespace UnsafeCodeApplication
{
class TestPointer
{
public unsafe void swap(int* p, int* q)
{
int temp = *p;
*p = *q;
*q = temp;
}
public unsafe static void Main()
{
TestPointer p = new TestPointer();
int var1 = 10;
int var2 = 20;
int* x = &var1;
int* y = &var2;
Console.WriteLine("Before Swap: var1:{0}, var2{1}", var1, var2);
p.swap(x, y);
Console.WriteLine("After Swap: var1:{0}, var2{1}", var1, var2);
Console.ReadKey();
}
}
}
演算結果:
例4:
/*使用指针访问数组元素*/
using System;
namespace UnsafeCodeApplication
{
class TestPointer
{
public unsafe static void Main()
{
int[] list = {
10, 100, 1000 };
//因为int* ptr 和int[]list是不同类型的,
//指针ptr在内存中是不固定
//而数组地址是固定的
//所以要用fixed关键字来固定指针
fixed(int* ptr = list) //固定指针
for(int i = 0; i<3; i++)
{
Console.WriteLine("Address of list[{0}] = {1}", i, (int)(ptr + i));
Console.WriteLine("value of list[{0}] = {1}", i, *(ptr + i));
}
Console.ReadKey();
}
}
}
演算結果: