首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C# 不安全程式碼詳解(二)

     編輯:關於C語言

指標陣列

在不安全內容中,允許指標陣列,只有少數轉換被允許:

  • 從任何陣列類型到 System.Array 或實現其介面的隱式參考類型轉換,同樣適用於指標陣列。但任何試圖透過 System.Array 或其介面訪問陣列元素都會引發執行時錯誤,因為指標類型不能轉換為 object。
  • 從一維陣列類型 S[] 到 System.Collections.Generic.IList<T> 或其基介面,任何顯式或隱式轉換都不行。因為指標類型不能作為類型參數,也沒有從指標類型到非指標類型的轉換。
  • 從 System.Array 或實現其介面到任何陣列類型的顯式參考轉換,適用於指標陣列。
  • 從 System.Collections.Generic.IList<T> 或其基介面到一維陣列類型 T[],任何顯式轉換都不行。原因同上。

對於 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
    }
}

變數 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());
        }
    }
}
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved