c#引用參數傳遞的深入剖析
值類型的變量存儲數據,而引用類型的變量存儲對實際數據的引用。(這一點很重要,明白了之後就能區分開值類型和引用類型的差別)
在參數傳遞時,值類型是以值的形式傳遞的(傳遞的是值,對變量本身沒有影響),是將要傳遞的參數的值復制給函數的形參,因此在函數體類對於該形參的任何改變都不會影響原來的值;
引用類型是以對象引用的形式傳遞的(傳遞的是引用,也就是說把同一個父級傳過去,擁有相同的父親),是將要傳遞的對象的引用復制給函數的形參,這時形參是實參引用的復制,注意:是引用的復制,而不是原引用,和原引用指向相同的對象,因此對於引用對象所做的更改將會直接影響原來的值,但是對於引用本身,在函數內的任何改變將不會影響原引用。
先列出前輩出的兩個例子:
data= a1.data = ; a1 = A(); a1.data = ; A a = A(); F(a); Console.WriteLine(a.data); } }
這是一個直接傳遞的例子,在F(a)調用時,是把值傳遞過去,a是引用參數,所以傳遞的是引用,也就是說把a的引用當做值傳遞給了F()函數中的a1,在F()函數中對a1操作:a1.data = "2";就改變了a的值,當執行a1 = new A();時,a1的引用初始化,也就是說不再是傳過來的那個,所以在執行a1.data = "3";是對a沒有影響。下面一個例子你會看到傳遞的不是值而就是引用,也就是說把引用傳給了a1,在a1 = new A();時,改變的是引用,也就是說引用的父親本身就變了 所以也就是改變了a的引用,最後a的值變成了3
ref 串參數:ref 關鍵字使參數按引用傳遞。其效果是,當控制權傳遞回調用方法時,在方法中對參數所做的任何更改都將反映在該變量中。若要使用 ref 參數,則方法定義和調用方法都必須顯式使用 ref 關鍵字。例如:對於值類型,可以向上面的引用串參數一樣傳遞,對於已經是引用類型的參數,大家可能會說那不是多此一舉嗎?其實不然,因為其中的實機理完全不一樣:考查上個示例的變種
data= F( a1.data = ; a1 = A(); a1.data = ; A a = A(); F( a); Console.WriteLine(a.data); }
可以這麼理解,沒有ref時的引用對象的參數傳遞就相當於c++中的一般指針傳遞(函數聲明相當於: void F(Type * v)),而有ref時的引用對象的參數傳遞相當於c++中的一般指向指針的指針傳遞(函數聲明相當於: void F(Type ** v)).
http://www.cnblogs.com/roucheng/