c#引用參數(shù)傳遞的深入剖析值類型的變量存儲數(shù)據(jù),而引用類型的變量存儲對實際數(shù)據(jù)的引用。(這一點很重要,明白了之后就能區(qū)分開值類型和引用類型的差別)
在參數(shù)傳遞時,值類型是以值的形式傳遞的(傳遞的是值,對變量本身沒有影響),是將要傳遞的參數(shù)的值復(fù)制給函數(shù)的形參,因此在函數(shù)體類對于該形參的任何改變都不會影響原來的值;
引用類型是以對象引用的形式傳遞的(傳遞的是引用,也就是說把同一個父級傳過去,擁有相同的父親),是將要傳遞的對象的引用復(fù)制給函數(shù)的形參,這時形參是實參引用的復(fù)制,注意:是引用的復(fù)制,而不是原引用,和原引用指向相同的對象,因此對于引用對象所做的更改將會直接影響原來的值,但是對于引用本身,在函數(shù)內(nèi)的任何改變將不會影響原引用。
先列出前輩出的兩個例子:
1 class A { 2 public string data=""; 3 } 4 class PRogram { 5 static void F( A a1) { 6 //a1指向傳來的對象a http://m.survivalescaperooms.com/roucheng/ 7 a1.data = "2";//修改a1指向的對象 8 a1 = new A();//a1指向另一個對象,注意,這時a1已經(jīng)不指向原來的對象a了,而原來的引用還是指向?qū)ο骯 9 a1.data = "3";//修改新建的對象,不會影響原來對象a的值 10 } 11 static void Main() { 12 A a = new A();//實例化A的一個對象,并用a1指向該對象 a.data = "1";//將a的data字段賦值為"1" 13 F(a);//調(diào)用函數(shù)F,注意:這時將對象a的引用(不是對象a)賦值給參數(shù)a1, 14 Console.WriteLine(a.data); } }這是一個直接傳遞的例子,在F(a)調(diào)用時,是把值傳遞過去,a是引用參數(shù),所以傳遞的是引用,也就是說把a的引用當(dāng)做值傳遞給了F()函數(shù)中的a1,在F()函數(shù)中對a1操作:a1.data = "2";就改變了a的值,當(dāng)執(zhí)行a1 = new A();時,a1的引用初始化,也就是說不再是傳過來的那個,所以在執(zhí)行a1.data = "3";是對a沒有影響。下面一個例子你會看到傳遞的不是值而就是引用,也就是說把引用傳給了a1,在a1 = new A();時,改變的是引用,也就是說引用的父親本身就變了 所以也就是改變了a的引用,最后a的值變成了3
ref 串參數(shù):ref 關(guān)鍵字使參數(shù)按引用傳遞。其效果是,當(dāng)控制權(quán)傳遞回調(diào)用方法時,在方法中對參數(shù)所做的任何更改都將反映在該變量中。若要使用 ref 參數(shù),則方法定義和調(diào)用方法都必須顯式使用 ref 關(guān)鍵字。例如:對于值類型,可以向上面的引用串參數(shù)一樣傳遞,對于已經(jīng)是引用類型的參數(shù),大家可能會說那不是多此一舉嗎?其實不然,因為其中的實機理完全不一樣:考查上個示例的變種
1 class A { 2 public string data=""; 3 } 4 class Program { 5 static void F( ref A a1) { 6 //a1和a是同一個實例,而不是指向同一對象的引用,即a1和a在存在于內(nèi)存中的地址是一樣的 7 a1.data = "2";//修改a1指向的對象 8 a1 = new A();//a1指向另一個對象,理所當(dāng)然別名a也指向該對象了,注意,這時原來的對象已經(jīng)沒有任何引用指向了,因此,可以說原來的對象已經(jīng)不可訪問了。 9 a1.data = "3";//修改新建的對象的屬性 } static void Main() { 10 A a = new A();//實例化A的一個對象,并用a1指向該對象 a.data = "1";//將a的data字段賦值為"1" 11 F(ref a);//調(diào)用函數(shù)F,注意:這時將對象a的引用傳給a1,不是賦值,相當(dāng)與 給a對象的引用起了個別名 12 Console.WriteLine(a.data);//這時a已經(jīng)指向函數(shù)中新建的對象,因此值應(yīng)為"3" 13 } 可以這么理解,沒有ref時的引用對象的參數(shù)傳遞就相當(dāng)于c++中的一般指針傳遞(函數(shù)聲明相當(dāng)于: void F(Type * v)),而有ref時的引用對象的參數(shù)傳遞相當(dāng)于c++中的一般指向指針的指針傳遞(函數(shù)聲明相當(dāng)于: void F(Type ** v)).
http://m.survivalescaperooms.com/roucheng/
新聞熱點
疑難解答