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

C# 之不安全代码(2)

 2009-06-11 08:31:51 来源:WEB开发网   
核心提示: 打印结果取决于endian,指针数组在不安全上下文中,C# 之不安全代码(2)(2),是允许指针数组的,只有几种用于其转换是允许的:l 从任何数组类型到System.Array或是实现了其接口的隐式引用类型转换同样适用于指针数组,相反,下面的语句foreach (V v in x) emb

打印结果取决于endian。

指针数组

在不安全上下文中,是允许指针数组的,只有几种用于其转换是允许的:

l  从任何数组类型到System.Array或是实现了其接口的隐式引用类型转换同样适用于指针数组。但是,任何试图通过System.Array或是实现了其接口访问数组元素都会引发一个 运行时错误,因为指针类型不能转化为object。

l  从一个一维数组类型S[]到System.Collections.Generic.IList<T>或是到其基接口,任何显示或是隐式的转换都是不行的。因为指针类型不能被用作类型参数,还有没有从指针类型到非指针类型的转换。

l  从System.Array或是实现了其接口到任何数组类型显示引用转换适用于指针数组。

l  从System.Collections.Generic.IList<T>或是到其基接口到一个一维数组类型T[],任何显示的转换都是不行的。原因同上面第2条。

还有就是对于foreach语句,不适用于指针数组。相反,下面的语句

foreach (V v in x) embedded-statement

中的x是一个数组类型T[,,…,],n是数组的维度减1,T和V是指针类型,被改写为:

{
      T[,,…,] a = x;
      V v;
      for (int i0 = a.GetLowerBound(0); i0 <= a.GetUpperBound(0); i0++)
      for (int i1 = a.GetLowerBound(1); i1 <= a.GetUpperBound(1); i1++)
      …
      for (int in = a.GetLowerBound(n); in <= a.GetUpperBound(n); in++) {
            v  = (V)a.GetValue(i0,i1,…,in);
                                embedded-statement
      }
}

Tags:安全 代码

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