C#:study(15)--“非保护”代码和C#关键字

        任何使用指针的代码都必须使用关键字unsafe来标记为“非保护”代码。可以标记单独一个语句,也可以标记整个方法。
 1 using System;
 2 class UnsafeCode
 3 {
 4 unsafe public static void Main()
 5 {
 6 int count = 99;
 7 int* p;
 8 = &count;
 9 Console.WriteLine("Initial value of count is " + *p);
10 *= 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可以防止垃圾回收器移动受控对象。当在如下的场合中使用指针时,就需要关键字fixed:指针并不知道垃圾回收器的存在,也不知道它做什么,因此当指针指向的对象被移动时,执政就会指向一个无效的对象。fixed的通用格式:
        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 *= 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就告诉编译器,每次访问变量都必须重新取变量的值。
posted @ 2005-08-23 14:35  zhh007's Bolg  阅读(260)  评论(0)    收藏  举报