最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

淺談C#中對(duì)引用類型的誤解

 更新時(shí)間:2019年08月05日 10:18:25   作者:qylost  
這篇文章主要介紹了淺談C#中對(duì)引用類型的誤解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

值類型和引用類型作為兩個(gè)非常基礎(chǔ)而且很重要的概念,一般我們都是在最開(kāi)始的時(shí)候?qū)W的,你聽(tīng)到的可能是這樣的:值類型傳遞的是具體的值(副本),引用類型傳遞的是引用,對(duì)于前者大家都不會(huì)有什么疑惑,但是在引用類型上就可能會(huì)進(jìn)入一些誤區(qū)。

概念插入:

值類型:值類型傳遞的是數(shù)據(jù)的副本,也就是將整個(gè)數(shù)據(jù)進(jìn)行Copy然后賦值給另一個(gè)變量。

引用類型:傳遞的是對(duì)象的地址/路徑(一般都會(huì)叫做引用),在對(duì)象的賦值過(guò)程中實(shí)際上是把目標(biāo)對(duì)象的地址以副本的形式給了接收的對(duì)象。

實(shí)例說(shuō)明

如下我們新建了一個(gè)Student類,定義了一個(gè)變量student1,然后定義了一個(gè)變量student2并將student1賦值給了它,緊接著創(chuàng)建了student3并將student3賦值給了student1。

輸出結(jié)果:1

class Program
{
  static void Main(string[] args)
  {
    //step1
    Student student1 = new Student() { StudentId = 1 };
    Student student2 = student1;
    Student student3 = new Student() { StudentId = 3 };
    //step2
    student1 = student3;
    Console.WriteLine(student2.StudentId.ToString());
    Console.ReadKey();
  }
}
public class Student
{
  public int StudentId { get; set; }
}

Step1的操作如下圖所示:

在圖中的右側(cè)我們使用矩形代替兩個(gè)通過(guò)new關(guān)鍵字創(chuàng)建的對(duì)象,并為其標(biāo)識(shí)了兩個(gè)虛擬的ID,在左側(cè)我們定義了三個(gè)變量,如圖的圓角矩形所示,這三個(gè)變量不是真正意義上的對(duì)象,只是對(duì)象的一個(gè)所在地址而已,也就是我們通過(guò)這個(gè)變量就可以找到一個(gè)特定的地址。其中student1變量持有的ID(內(nèi)存地址)為1001,student2也是1001,student3為1002。這里需要注意的是student1的1001和student2的1001雖然都是指向的1001,但是這兩個(gè)1001都只是對(duì)象地址的一個(gè)副本,也就是說(shuō)student1的1001和student2的1001并不是同一個(gè),只是被Copy了而已(可以理解為這個(gè)地址是以值類型的方式進(jìn)行傳遞的)。

這里要注意的是變量student2和student1是沒(méi)有關(guān)系的,它們只和右側(cè)的1001有關(guān)系,只是它們地址的值是相等的。

new關(guān)鍵字:

創(chuàng)建特定對(duì)象的實(shí)例并返回其引用地址(只是返回了地址的一個(gè)副本,而不是真正的對(duì)象)

When the object is created, the memory is allocated on the managed heap, and the variable holds only a reference to the location of the object.(來(lái)源于官方文檔:https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/types/

譯:創(chuàng)建對(duì)象后,內(nèi)存會(huì)在托管堆上進(jìn)行分配,并且變量只保留對(duì)對(duì)象位置的引用。

Step2的操作如下圖所示:

在Step2的代碼中我們將student3的變量賦值給了student1,那么這段代碼執(zhí)行的是將student3對(duì)應(yīng)的ID(引用地址)以副本的方式給了student1。

//step2
student1 = student3;
Console.WriteLine(student2.StudentId.ToString());
Console.ReadKey();

如果你對(duì)引用傳遞理解有有偏差的話你可能會(huì)認(rèn)為student2的地址也會(huì)變成1002,也就是student2.StudentId變成了3。這樣理解是不正確的,我們剛才說(shuō)過(guò)了雖然它們的引用地址是都是1001,但是這個(gè)地址也是通過(guò)副本進(jìn)行傳遞的。也就是說(shuō)當(dāng)student1的地址發(fā)生改變并不會(huì)影響student2的地址。

再述:

當(dāng)右側(cè)對(duì)象中的值發(fā)生改變時(shí),通過(guò)左側(cè)變量來(lái)獲取拿到的就是改變后的值,而當(dāng)左側(cè)變量值的改變時(shí)并不會(huì)影響右側(cè)對(duì)象值的。左側(cè)變量值的改變只是對(duì)應(yīng)的地址發(fā)生了改變而不是對(duì)象的值發(fā)生了改變。

舉例分析

這里從我們常用的兩個(gè)購(gòu)物平臺(tái)淘寶、京東來(lái)舉例說(shuō)明引用地址傳遞。

右側(cè)有兩個(gè)對(duì)象分別是淘寶和京東,左側(cè)我們定義了三個(gè)變量來(lái)保存這個(gè)對(duì)象的地址(和上邊的例子是一樣的)

如下圖,我們將valA變量存放的地址改成了www.jd.com ,我們只是改變了變量存放的地址而并沒(méi)有改變valA之前所對(duì)應(yīng)的對(duì)象的值。

總結(jié)

引用類型傳遞的是對(duì)象的引用,是將引用地址以副本的方式進(jìn)行傳遞。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

最新評(píng)論

芜湖市| 栾川县| 石楼县| 儋州市| 怀化市| 广灵县| 海兴县| 贵定县| 北海市| 环江| 太原市| 开鲁县| 康马县| 保靖县| 宁国市| 九台市| 泾阳县| 台东县| 望城县| 桓台县| 海门市| 上思县| 赫章县| 永嘉县| 抚远县| 新巴尔虎右旗| 呼伦贝尔市| 梨树县| 新绛县| 定兴县| 河津市| 迭部县| 巴南区| 淅川县| 交城县| 紫云| 高密市| 色达县| 运城市| 汕尾市| 临朐县|