解釋並對比 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

更新於: 2021年5月19日

244 次檢視

開啟您的 職業生涯

透過完成課程獲得認證

開始學習
廣告