C# ref/out/is/as

C# ref/out/is/as

ref

ref 等同於 C 中的 &,代表傳送 reference。

int value = 3;
Func1(ref value);


out

out 意指 method body 中必需指定值給它:

void Func1( out int param )
{
   //do nothing
}

上例中是不合法的,因為 param 指定為 out,必需在 method body 中給值:

void Func1( out int param )
{
   param = 99;
}

改成上面才是正確的。


object boxing/unboxing

object 這個 type 可以用來表示任意 type:

int i = 55;
object o = i;

上例中,我們將 value type 指定給 object type。這邊的情況是這樣的:i 這個值由於是 value type,因此它存在 stack 中;然而 o 是一個 object type,它事實上是存放一個指到 heap 的 reference。那這樣上例怎麼可以呢?故系統在 runtime 時,會將位在 stack 的 i 複製一份到 heap 中,然後將 o 指向它,這個動作就叫 boxing。注意這兒我們就有兩份 i 了。故在上例中,更改 i 不會改變 o 的值。而更改 o 也不會變動 i 的值。

而 unboxing 就是把 o 再指回給一個 value type:

int j = (int)o;

這邊要用一個 cast 來告訴 compiler 它是一個 int。unboxing 這個動作就是將 o 指到位於 heap 中的資料複製一份回 stack。


is/as operator

單純使用 casting 的方式有點不保險,因為它並沒有檢查 cast 是否正確。在 C# 使用 is 來檢查:

classA j;
if (o is classA)
   j = (classA)o;

如此就不怕 o 不能轉換成 int 了。

而 as 有點類似 is,它會嘗試轉換,但失敗會傳回 null:

classA j = o as classA;
if (j != null)
   // cast successfully


留言

熱門文章