C# 之不安全代码(2)
2009-06-11 08:31:51 来源:WEB开发网变量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
更多精彩
赞助商链接