ref和不加ref不等價,他們的區別在這裏:
public class MyClass
{
public static void Main()
{
Hashtable ht = new Hashtable();
ht["abc"] = 1;
Console.WriteLine(ht.Count);
myFunction(ht);
Console.WriteLine(ht.Count);
myRefFunction(ref ht);
Console.WriteLine(ht.Count);
}
public static void myFunction(Hashtable ht)
{
ht = new Hashtable();
}
public static void myRefFunction(ref Hashtable ht)
{
ht = new Hashtable();
}
}
猜一下輸出的結果是什麼吧。
不加ref的參數傳遞是by value的方式,如果是一個引用類型那麼傳遞的是一個指針,也就是把對象的指針複製了一份傳遞給函數的參數,兩個指針指向同一個對象,因此對他們的修改是對同一個對象的修改。
但是在myFunction中重新建立了一個對象,實際上是修改了hashtable對象指針的一個副本,原來的那個hashtable並沒有受到影響。
加了ref就是按引用傳遞了,自是之中都只有一個指針,也指向同一個對象,對這個指針進行的操作自然是會影響原來的那個對象。因此在myRefFunction中改變了傳遞過來的指針的值,在最初的掉用函數中的原來的指針也改成了新建的對象。
因此輸出結果是
1
1
0