指標陣列
在不安全內容中,允許指標陣列,只有少數轉換被允許:
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());
}
}
}