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 }

 

posted @ 2015-05-03 13:52  ht-beyond  阅读(264)  评论(0编辑  收藏  举报