国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

實例對比剖析c#引用參數(shù)的用法

2019-11-17 03:23:45
字體:
供稿:網(wǎng)友

實例對比剖析c#引用參數(shù)的用法

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/


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 盘山县| 临武县| 辽阳县| 东台市| 彭州市| 吴川市| 余庆县| 石嘴山市| 吐鲁番市| 和田市| 定陶县| 临颍县| 无锡市| 托克逊县| 山东| 万山特区| 兴业县| 泰顺县| 富锦市| 吴忠市| 利津县| 吉水县| 普格县| 楚雄市| 益阳市| 孝感市| 济宁市| 中江县| 长宁区| 海城市| 桃园市| 英德市| 乌拉特前旗| 比如县| 乌兰察布市| 彭州市| 昌都县| 衡南县| 固阳县| 克什克腾旗| 江源县|