Unsafe Code
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 7 namespace UnsafeCode 8 { 9 struct Point 10 { 11 public int x; 12 public int y; 13 14 public override string ToString() 15 { 16 return string.Format("({0}, {1})", x, y); 17 } 18 } 19 20 class PointRef 21 { 22 public int x; 23 public int y; 24 public override string ToString() 25 { 26 return string.Format("({0}, {1})", x, y); 27 } 28 } 29 30 class Program 31 { 32 static void Main( string[] args ) 33 { 34 Console.WriteLine("***** Calling method with unsafe code *****"); 35 36 int i = 10, j = 20; 37 38 // 安全交换 39 Console.WriteLine("\n***** Safe swap *****"); 40 Console.WriteLine("Values before safe swap: i = {0}, j = {1}", i, j); 41 SafeSwap(ref i, ref j); 42 Console.WriteLine("Values after safe swap: i = {0}, j = {1}", i, j); 43 44 // 不安全交换 45 Console.WriteLine("\n***** Unsafe swap *****"); 46 Console.WriteLine("Values before unsafe swap: i = {0}, j = {1}", i, j); 47 unsafe { UnsafeSwap(&i, &j); } 48 Console.WriteLine("Values after unsafe swap: i = {0}, j = {1}", i, j); 49 50 UsePointerToPoint(); 51 PrintValueAndAddress(); 52 UseAndPinPoint(); 53 UseSizeOfOperator(); 54 55 Console.ReadLine(); 56 } 57 58 unsafe static void UsePointerToPoint() 59 { 60 // 指针访问成员 61 Point point; 62 Point* p = &point; 63 p->x = 100; 64 p->y = 200; 65 Console.WriteLine(p->ToString()); 66 67 // 指针间接寻址访问成员 68 Point point2; 69 Point* p2 = &point2; 70 (*p2).x = 100; 71 (*p2).y = 200; 72 Console.WriteLine((*p2).ToString()); 73 } 74 75 unsafe static void UnsafeStackAlloc() 76 { 77 char* p = stackalloc char[256]; 78 for (int k = 0; k < 256; k++) 79 p[k] = (char)k; 80 } 81 82 // 静态方法或实例方法均可被标记为不安全 83 unsafe static void SquareIntPointer( int* myIntPointer ) 84 { 85 *myIntPointer *= *myIntPointer; 86 } 87 88 unsafe static void PrintValueAndAddress() 89 { 90 int myInt; 91 int* ptrToMyInt = &myInt; 92 93 // 指针间接寻址为myInt赋值 94 *ptrToMyInt = 123; 95 96 Console.WriteLine("Value of myInt {0}", myInt); 97 Console.WriteLine("Address of myInt {0:X}", (int)&ptrToMyInt); 98 } 99 100 unsafe public static void UnsafeSwap( int* i, int* j ) 101 { 102 int temp = *i; 103 *i = *j; 104 *j = temp; 105 } 106 107 unsafe public static void UseAndPinPoint() 108 { 109 PointRef pt = new PointRef(); 110 pt.x = 5; 111 pt.y = 6; 112 113 // fixed 语句设置指向托管类型的指针并在代码执行过程中固定该变量 114 // 固定pt 115 fixed (int* p = &pt.x) 116 { 117 // 此处可使用 int* 变量 118 } 119 120 // pt未固定,该方法完成后可被GC清除 121 Console.WriteLine("Point is: {0}", pt); 122 } 123 124 unsafe static void UseSizeOfOperator() 125 {// 不安全关键字 sizeof 126 Console.WriteLine("The size of short is {0}.", sizeof(short)); 127 Console.WriteLine("The size of int is {0}.", sizeof(int)); 128 Console.WriteLine("The size of long is {0}.", sizeof(long)); 129 Console.WriteLine("The size of Point is {0}.", sizeof(Point)); 130 } 131 132 public static void SafeSwap( ref int i, ref int j ) 133 { 134 int temp = i; 135 i = j; 136 j = temp; 137 } 138 } 139 }