C#:study(15)--“非保护”代码和C#关键字
任何使用指针的代码都必须使用关键字unsafe来标记为“非保护”代码。可以标记单独一个语句,也可以标记整个方法。
关键字fixed可以防止垃圾回收器移动受控对象。当在如下的场合中使用指针时,就需要关键字fixed:指针并不知道垃圾回收器的存在,也不知道它做什么,因此当指针指向的对象被移动时,执政就会指向一个无效的对象。fixed的通用格式:
fixed(type * p = &fixedObj){
//使用固定对象
}
使用sizeof可以知道数据类型占用多少字节,格式为:sizeof(type),此运算符只能用于“非保护”代码的上下文中。
使用stackalloc可以在栈上分配内存,但只能用于初始化局部变量,其一般格式如下:
type *p = stackalloc type[size];此运算符只能用于“非保护”代码的上下文中。
关键字internal:只能在assembly内部才能访问。
关键字lock:用于多线程的程序中。格式:lock(obj){。。。}
关键字readonly:readonly成员可以被初始化,但之后就不能改变。
关键字using:〔using声明〕格式:using(obj){//使用obj};当块结束的时候,就会调用Dispose()方法。using的这种用法只适用于实现了System.IDispose接口的对象。
关键字const:声明常量;必须赋初值。
关键字volatile:通知编译器变量的值可能会以一种程序没有明确指定的方式改变。例如,一个保存当前系统时间的变量会被操作系统自动更新。在这种情况下,没有明确的赋值语句来改变变量的值。之所以要允许变量能被外部改变,是因为C#编译器假定,如果变量不出现在表达式的左侧,那么其值是不会改变的,因此会自动优化这些特殊的表达式。但如果存在执行代码外的因素如另外的线程,改变了变量的值,那么假设就不成立。通过适用volatile就告诉编译器,每次访问变量都必须重新取变量的值。
1 using System;
2 class UnsafeCode
3 {
4 unsafe public static void Main()
5 {
6 int count = 99;
7 int* p;
8 p = &count;
9 Console.WriteLine("Initial value of count is " + *p);
10 *p = 10;
11 Console.WriteLine("New value of count is " + *p);
12 }
13 }
14 //-----程序结果-----
15 Initial value of count is 99
16 New value of count is 10
2 class UnsafeCode
3 {
4 unsafe public static void Main()
5 {
6 int count = 99;
7 int* p;
8 p = &count;
9 Console.WriteLine("Initial value of count is " + *p);
10 *p = 10;
11 Console.WriteLine("New value of count is " + *p);
12 }
13 }
14 //-----程序结果-----
15 Initial value of count is 99
16 New value of count is 10
fixed(type * p = &fixedObj){
//使用固定对象
}
1 using System;
2 class Test
3 {
4 public int num;
5 public Test(int i){num = i;}
6 }
7 class UnsafeCode
8 {
9 Test o = new Test(19);
10 fixed(int* p = &o.num)
11 {
12 Console.WriteLine("Initial value of o.num is " + *p);
13 *p = 10;
14 Console.WriteLine("New value of o.num is " + *p);
15 }
16 }
17 //-----程序结果-----
18 Initial value of o.num is 19
19 New value of o.num is 10
2 class Test
3 {
4 public int num;
5 public Test(int i){num = i;}
6 }
7 class UnsafeCode
8 {
9 Test o = new Test(19);
10 fixed(int* p = &o.num)
11 {
12 Console.WriteLine("Initial value of o.num is " + *p);
13 *p = 10;
14 Console.WriteLine("New value of o.num is " + *p);
15 }
16 }
17 //-----程序结果-----
18 Initial value of o.num is 19
19 New value of o.num is 10
使用sizeof可以知道数据类型占用多少字节,格式为:sizeof(type),此运算符只能用于“非保护”代码的上下文中。
使用stackalloc可以在栈上分配内存,但只能用于初始化局部变量,其一般格式如下:
type *p = stackalloc type[size];此运算符只能用于“非保护”代码的上下文中。
关键字internal:只能在assembly内部才能访问。
关键字lock:用于多线程的程序中。格式:lock(obj){。。。}
关键字readonly:readonly成员可以被初始化,但之后就不能改变。
关键字using:〔using声明〕格式:using(obj){//使用obj};当块结束的时候,就会调用Dispose()方法。using的这种用法只适用于实现了System.IDispose接口的对象。
关键字const:声明常量;必须赋初值。
关键字volatile:通知编译器变量的值可能会以一种程序没有明确指定的方式改变。例如,一个保存当前系统时间的变量会被操作系统自动更新。在这种情况下,没有明确的赋值语句来改变变量的值。之所以要允许变量能被外部改变,是因为C#编译器假定,如果变量不出现在表达式的左侧,那么其值是不会改变的,因此会自动优化这些特殊的表达式。但如果存在执行代码外的因素如另外的线程,改变了变量的值,那么假设就不成立。通过适用volatile就告诉编译器,每次访问变量都必须重新取变量的值。

浙公网安备 33010602011771号