不安全代码就是要写在unsafe命名空间下,对内存地址直接操作的代码。在默认情况下C#编译器生成的是安全代码,在编译不安全代码时,C#编译器要求我们使用/unsafe编译器开关来编译源代码,在IDE中,选中“项目属性->生成”里的“允许不安全代码”,编译时就会自动加上/unsafe选项。
不安全代码就是要写在unsafe命名空间下,对内存地址直接操作的代码。在默认情况下C#编译器生成的是安全代码,在编译不安全代码时,C#编译器要求我们使用/unsafe编译器开关来编译源代码,在IDE中,选中“项目属性->生成”里的“允许不安全代码”,编译时就会自动加上/unsafe选项。
以下代码为来自山水林木子的文章http://www.cnblogs.com/hananbaum/archive/2008/10/30/1323364.html
Code
1using System;
2
3namespace Sophy.UnsafeCode
4{
5 unsafe class Program
6 {
7 static void Main(string[] args)
8 {
9 //在栈上分配内存
10 byte* arr_on_stack = stackalloc byte[100];
11
12 //下标访问数组
13 for (int i = 0; i < 100; i++)
14 {
15 arr_on_stack[i] = 0;
16 }
17
18 //在堆上分配内存
19 fixed (byte* arr_on_heap = new byte[100])
20 {
21 //指针访问数组
22 for (int i = 0; i < 100; i++)
23 {
24 *(arr_on_heap + i) = 0;
25 }
26 }
27
28 //在栈上分配一个结构体
29 Point p = new Point();
30 //用结构体指针操作栈上的结构体
31 Point* pp = &p;
32 pp->x = 200;
33 (*pp).y = 300;
34
35 //在堆上分配一个结构体
36 fixed (byte* bs = new byte[sizeof(Point)])
37 {
38 //用结构体指针操作堆上的结构体
39 Point* ph = (Point*)bs;
40 (*ph).x = 400;
41 ph->y = 500;
42 }
43
44 //打印结构体内存地址
45 Console.WriteLine("pp Memory Address: 0x{0:X}.", ((int)pp).ToString());
46
47 //识别CPU字节序
48 pp->x = 1;
49 byte* pb = (byte*)&(pp->x);
50 if (1 == *pb)
51 {
52 Console.WriteLine("Your CPU is little endian.");
53 }
54 else if (1 == *(pb + sizeof(int) - 1))
55 {
56 Console.WriteLine("Your CPU is big endian.");
57 }
58 else
59 {
60 Console.WriteLine("Unkown.");
61 }
62 }
63 }
64
65 unsafe struct Point
66 {
67 public int x;
68 public int y;
69 }
70}