練習 - 探索參考類型
- 8 分鐘
參考型別包括陣列、類別和字串。 參考型別的處理方式,在執行應用程式時儲存值的方式上與實值型別不同。
在本練習中,您將會了解參考型別與實值型別的不同,以及如何使用 new 運算子來將變數與電腦記憶體中的值建立關聯。
參考型別與實值型別有何不同
實值型別變數會將其值直接儲存在稱為「堆疊」的儲存體區域。 堆疊是配置到目前正在 CPU 上執行程式碼的記憶體 (也稱為堆疊框架或啟用框架)。 當堆疊框架完成執行後,隨即移除堆疊中的值。
參考型別變數會將其值儲存在稱為「堆積」的不同記憶體區域中。 堆積是同時在作業系統上執行的許多應用程式所共用記憶體區域。 .NET 執行階段會和作業系統通訊,判斷哪些記憶體位址可用,並要求可儲存值的位址。 .NET 執行階段會儲存值,然後將記憶體位址傳回至變數。 當程式碼使用變數時,.NET 執行階段便會順暢地查閱儲存在變數中的位址,並擷取儲存在該處的值。
您接下來會撰寫一些程式碼,更清楚地呈現這些想法。
定義參考型別變數
刪除或使用行註解運算子
//,將上一個練習中的所有程式碼標記為註解。在 Visual Studio Code 編輯器更新您的程式碼,如下所示:
int[] data;上述程式碼會定義變數,保存
int類型陣列的值。此時,
data僅只是一個變數,可保存參考,或是堆積中值的記憶體位址。 由於其並未指向記憶體位址,因此稱為「Null 參考」。使用
int關鍵字建立new陣列的執行個體使用下列程式碼,在 [Visual Studio Code 編輯器] 中更新程式碼,建立並指派
int陣列的新執行個體:int[] data; data = new int[3];new關鍵字會通知 .NET 執行階段建立int陣列的執行個體,然後與作業系統協調,將其儲存在記憶體中。 .NET 執行階段會編譯並傳回新int陣列的記憶體位址。 最後,記憶體位址會儲存在變數資料中。int陣列的元素預設為值0,因為這是int的預設值。修改程式碼範例,在單行程式碼中執行兩種作業
上述步驟中的兩行程式碼通常會縮短成單行程式碼,同時宣告變數並建立
int陣列的新執行個體。 將步驟 3 中的程式碼修改為下列內容。int[] data = new int[3];雖然沒有可觀察的輸出,但希望本練習可讓 C# 語法與使用參考類型的處理序步驟相關方式更加清楚。
C# 字串資料類型有何不同?
string 資料類型也是參考型別。 您可能會好奇為何在宣告字串時不使用 new 運算子。 這純粹是 C# 設計人員提供的便利性。 因為 string 資料類型頻繁使用,所以您可使用此格式:
string shortenedString = "Hello World!";
Console.WriteLine(shortenedString);
不過,會在幕後建立 System.String 的新執行個體,並初始化為 "Hello World!"。
使用實值和參考類型的實際考量
-
實值類型 (int):在此範例中,
val_A和val_B是整數實值類型。
int val_A = 2;
int val_B = val_A;
val_B = 5;
Console.WriteLine("--Value Types--");
Console.WriteLine($"val_A: {val_A}");
Console.WriteLine($"val_B: {val_B}");
您應該會看見下列輸出:
--Value Types--
val_A: 2
val_B: 5
val_B = val_A 執行時,會複製 val_A 的值並將其儲存在 val_B 中。 因此,當 val_B 變更時,val_A 不受影響。
-
參考類型 (陣列):在此範例中,
ref_A和ref_B是陣列參考類型。
int[] ref_A= new int[1];
ref_A[0] = 2;
int[] ref_B = ref_A;
ref_B[0] = 5;
Console.WriteLine("--Reference Types--");
Console.WriteLine($"ref_A[0]: {ref_A[0]}");
Console.WriteLine($"ref_B[0]: {ref_B[0]}");
您應該會看見下列輸出:
--Reference Types--
ref_A[0]: 5
ref_B[0]: 5
ref_B = ref_A 執行時,ref_B 會指向與 ref_A 相同的記憶體位置。 因此,當 ref_B[0] 變更時,ref_A[0] 也會隨之變更,因為兩者指向相同的記憶體位置。 這是實值類型與參考類型之間的主要差異。
概括回顧
- 實值型別可保存較小的值,並會儲存在堆疊中。 參考型別可保存較大的值,且參考型別的新執行個體是使用
new運算子來建立。 參考型別變數會保存儲存在堆積中實際值的參考 (記憶體位址)。 - 參考型別包括陣列、字串和類別。
檢定您的知識
意見反應
此頁面對您有幫助嗎?
No
需要本主題的協助嗎?
想要嘗試使用 Ask Learn 來釐清或引導您完成本主題嗎?