WEB开发网
开发学院软件开发C语言 C# 之不安全代码(2) 阅读

C# 之不安全代码(2)

 2009-06-11 08:31:51 来源:WEB开发网   
核心提示: 变量a,i0,i1,…对于x或者embedded-statement或者其余部分的代码是不可见的或是不可访问的,变量v在embedded-statement中是只读的,C# 之不安全代码(2)(3),如果没有显示转换从T到V,那么就会有错误,例如:using System;s

变量a,i0,i1,…对于x或者embedded-statement或者其余部分的代码是不可见的或是不可访问的。变量v在embedded-statement中是只读的。如果没有显示转换从T到V,那么就会有错误。如果x是个null,就会有空引用异常。

表达式中的指针

在不安全上下文中,一个表达式的值可以来自于一个指针类型;但是在上下文之外,会造成编译时期错误。

间接访问

一元的*表示一个指针,被用来获得指针指向的值。*用在void*类型表达式或是非指针类型表达式时,会造成编译期错误。

*被用在null指针时是由实现来决定的。不能保证在使用时会抛出System.NullReferenceException。

如果一个非法的值赋给指针,那么*的行为是不可预知的。

指针成员访问

在指针成员访问P->I中,P必须是除了void*之外的类型,I同时必须是一个可访问的成员。

P->I效果上相同于(*P).I。例如:

using System;
struct Point
{
    public int x;
    public int y;
    public override string ToString() {
        return "(" + x + "," + y + ")";
    }
}
class Test
{
    static void Main() {
        Point point;
        unsafe {
            Point* p = &point;
            p->x = 10;
            p->y = 20;
            Console.WriteLine(p->ToString());
        }
    }
}

或是:

class Test
{
    static void Main() {
        Point point;
        unsafe {
            Point* p = &point;
            (*p).x = 10;
            (*p).y = 20;
            Console.WriteLine((*p).ToString());
        }
    }
}

指针元素访问

在指针元素访问P[E]中,P必须是除了void*之外的类型,同时E必须能隐式的转换为int, uint, long, or ulong的表达式。

P[E]效果上同*(P + E).例如: 

 1 class Test
 2 {
 3     static void Main() {
 4         unsafe {
 5             char* p = stackalloc char[256];
 6             for (int i = 0; i < 256; i++) p[i] = (char)i;
 7         }
 8     }
 9 }
10 又如:
11 class Test
12 {
13     static void Main() {
14         unsafe {
15             char* p = stackalloc char[256];
16             for (int i = 0; i < 256; i++) *(p + i) = (char)i;
17         }
18     }
19 }
20

上一页  1 2 3 

Tags:安全 代码

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接