您好,登錄后才能下訂單哦!
這篇文章主要介紹了C#中引用類型的示例分析,具有一定借鑒價(jià)值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
值類型和引用類型作為兩個(gè)非?;A(chǔ)而且很重要的概念,一般我們都是在最開始的時(shí)候?qū)W的,你聽到的可能是這樣的:值類型傳遞的是具體的值(副本),引用類型傳遞的是引用,對于前者大家都不會有什么疑惑,但是在引用類型上就可能會進(jìn)入一些誤區(qū)。
概念插入:
值類型:值類型傳遞的是數(shù)據(jù)的副本,也就是將整個(gè)數(shù)據(jù)進(jìn)行Copy然后賦值給另一個(gè)變量。
引用類型:傳遞的是對象的地址/路徑(一般都會叫做引用),在對象的賦值過程中實(shí)際上是把目標(biāo)對象的地址以副本的形式給了接收的對象。
實(shí)例說明
如下我們新建了一個(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è)通過new關(guān)鍵字創(chuàng)建的對象,并為其標(biāo)識了兩個(gè)虛擬的ID,在左側(cè)我們定義了三個(gè)變量,如圖的圓角矩形所示,這三個(gè)變量不是真正意義上的對象,只是對象的一個(gè)所在地址而已,也就是我們通過這個(gè)變量就可以找到一個(gè)特定的地址。其中student1變量持有的ID(內(nèi)存地址)為1001,student2也是1001,student3為1002。這里需要注意的是student1的1001和student2的1001雖然都是指向的1001,但是這兩個(gè)1001都只是對象地址的一個(gè)副本,也就是說student1的1001和student2的1001并不是同一個(gè),只是被Copy了而已(可以理解為這個(gè)地址是以值類型的方式進(jìn)行傳遞的)。
這里要注意的是變量student2和student1是沒有關(guān)系的,它們只和右側(cè)的1001有關(guān)系,只是它們地址的值是相等的。
new關(guān)鍵字:
創(chuàng)建特定對象的實(shí)例并返回其引用地址(只是返回了地址的一個(gè)副本,而不是真正的對象)
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.(來源于官方文檔:https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/types/)
譯:創(chuàng)建對象后,內(nèi)存會在托管堆上進(jìn)行分配,并且變量只保留對對象位置的引用。
Step2的操作如下圖所示:
在Step2的代碼中我們將student3的變量賦值給了student1,那么這段代碼執(zhí)行的是將student3對應(yīng)的ID(引用地址)以副本的方式給了student1。
//step2 student1 = student3; Console.WriteLine(student2.StudentId.ToString()); Console.ReadKey();
如果你對引用傳遞理解有有偏差的話你可能會認(rèn)為student2的地址也會變成1002,也就是student2.StudentId變成了3。這樣理解是不正確的,我們剛才說過了雖然它們的引用地址是都是1001,但是這個(gè)地址也是通過副本進(jìn)行傳遞的。也就是說當(dāng)student1的地址發(fā)生改變并不會影響student2的地址。
再述:
當(dāng)右側(cè)對象中的值發(fā)生改變時(shí),通過左側(cè)變量來獲取拿到的就是改變后的值,而當(dāng)左側(cè)變量值的改變時(shí)并不會影響右側(cè)對象值的。左側(cè)變量值的改變只是對應(yīng)的地址發(fā)生了改變而不是對象的值發(fā)生了改變。
舉例分析
這里從我們常用的兩個(gè)購物平臺淘寶、京東來舉例說明引用地址傳遞。
右側(cè)有兩個(gè)對象分別是淘寶和京東,左側(cè)我們定義了三個(gè)變量來保存這個(gè)對象的地址(和上邊的例子是一樣的)
如下圖,我們將valA變量存放的地址改成了www.jd.com ,我們只是改變了變量存放的地址而并沒有改變valA之前所對應(yīng)的對象的值。
感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“C#中引用類型的示例分析”這篇文章對大家有幫助,同時(shí)也希望大家多多支持億速云,關(guān)注億速云行業(yè)資訊頻道,更多相關(guān)知識等著你來學(xué)習(xí)!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。