首先先设置一下:
鼠标右键点工程,选择生成,勾选上允许不安全代码。
解释一下什么是不安全代码:
C#是一门托管语言,可以不用自己去管理内存。有一些机制的出现代替了C/C++中的指针,如引用、托管、事件等机制。但是C#并没有像java一样完全抛弃掉指针,所以在C#下还可以用指针的。当一个代码块使用unsafe修饰标记符时,C#允许在函数中使用指针变量。不安全代码或非托管代码是指使用变量的代码块。
用unsafe关键字编写不安全代码
因为使用指针会带来相关的风险,所以C#只允许在特别标记的代码块中使用指针。标记代码所用的关键字是unsafe。下面代码把一个方法标记为unsafe:
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();
}
}
}
运行结果: