解釋並對比 C# 中的值型別和引用型別
一般來說,C# 中的所有型別可以分為兩大類:**值型別**和**引用型別**。讓我們詳細瞭解每種型別。
值型別
值型別變數直接包含其資料。每個變數都有其自身的資料副本。因此,值型別變數不可能修改另一個物件。
值型別可以是以下型別之一:
- 所有數值型別,例如**int**、**float**和**double**
- **char**和**bool**型別
- **struct**型別或
- **列舉**型別。
值型別簡單地包含值。例如,整數型別包含實際的數字,而不是像引用型別那樣指向數字的指標。
要建立自定義值型別,可以使用結構體。例如:
public struct Point { public int X; public int Y; } var p1 = new Point();
在記憶體中,Point 的例項表示如下:
當您將值型別變數賦值給另一個變數時,賦值操作會建立正在賦值的值的副本。例如,
Point p2 = p1;
引用型別
引用型別變數儲存對其物件的引用。兩個不同的變數有可能持有對同一物件的引用。一個變數對物件所做的任何更改都對第二個變數可見。
引用型別包含以下型別:
- 字串
- 類
- 陣列
- 委託
- 介面
例如,您可以建立一個類,它是一種引用型別,如下所示:
public class Point{ public int X; public int Y; } var p1 = new Point();
當您將引用型別變數賦值給另一個變數時,賦值操作僅複製引用,而不是實際的物件。
Point p2 = p1;
示例
using System; class Program{ static void Main(){ var p1 = new Point { X = 10 }; Point p2 = p1; p2.X = 20; Console.WriteLine("Value Type"); Console.WriteLine(p1.X); Console.WriteLine(p2.X); var u1 = new User { Age = 10 }; User u2 = u1; u2.Age = 20; Console.WriteLine("Reference Type"); Console.WriteLine(u1.Age); Console.WriteLine(u2.Age); } } public struct Point{ public int X; public int Y; } public class User{ public int Age { get; set; } }
輸出
Value Type 10 20 Reference Type 20 20
廣告