共用方式為


實值類型 (C# 參考)

「實值類型」和「參考類型」是 C# 類型的兩個主要類別。 實值類型的變數會包含類型的執行個體。 此行為不同於參考型別變數,後者包含對該型別實例的參考。 預設情況下,在 賦值時,將參數傳給方法,並回傳方法結果,就是複製變數值。 對於值型變數,你複製對應的型別實例。 下列範例示範了該行為:

using System;

public struct MutablePoint
{
    public int X;
    public int Y;

    public MutablePoint(int x, int y) => (X, Y) = (x, y);

    public override string ToString() => $"({X}, {Y})";
}

public class Program
{
    public static void Main()
    {
        var p1 = new MutablePoint(1, 2);
        var p2 = p1;
        p2.Y = 200;
        Console.WriteLine($"{nameof(p1)} after {nameof(p2)} is modified: {p1}");
        Console.WriteLine($"{nameof(p2)}: {p2}");

        MutateAndDisplay(p2);
        Console.WriteLine($"{nameof(p2)} after passing to a method: {p2}");
    }

    private static void MutateAndDisplay(MutablePoint p)
    {
        p.X = 100;
        Console.WriteLine($"Point mutated in a method: {p}");
    }
}
// Expected output:
// p1 after p2 is modified: (1, 2)
// p2: (1, 200)
// Point mutated in a method: (100, 200)
// p2 after passing to a method: (1, 200)

如上述範例所示,實值類型變數的作業只會影響變數中所儲存的實值類型執行個體。

如果一個值型別包含某參考型別的資料成員,當你複製一個值型別實例時,只會將該參考值複製到該參考型別的實例。 複製和原始實值類型執行個體都可以存取相同的參考類型執行個體。 下列範例示範了該行為:

using System;
using System.Collections.Generic;

public struct TaggedInteger
{
    public int Number;
    private List<string> tags;

    public TaggedInteger(int n)
    {
        Number = n;
        tags = new List<string>();
    }

    public void AddTag(string tag) => tags.Add(tag);

    public override string ToString() => $"{Number} [{string.Join(", ", tags)}]";
}

public class Program
{
    public static void Main()
    {
        var n1 = new TaggedInteger(0);
        n1.AddTag("A");
        Console.WriteLine(n1);  // output: 0 [A]

        var n2 = n1;
        n2.Number = 7;
        n2.AddTag("B");

        Console.WriteLine(n1);  // output: 0 [A, B]
        Console.WriteLine(n2);  // output: 7 [A, B]
    }
}

注意

若要讓您的程式碼更少出錯且更為健全,請定義並使用不可變的實值類型。 本文只使用可變實值類型來進行示範。

實值類型和類型限制式的種類

值類型可以是以下其中一種:

  • 結構 型態,封裝資料及相關功能。
  • 舉類型由一組命名常數定義,代表一個選擇或多個選擇的組合。
  • 聯合宣告,定義了一組封閉的案例類型,讓一個值可以代表。

可為 Null 的實值型別T? 代表其基礎實值型別 T 的所有值,以及額外的 Null 值。 你不能指派 null 給某個值型別的變數,除非它是可空的值型別。

利用限制struct指定型態參數為不可空的值型態。 結構和列舉類型都滿足 struct 限制式。 在基底類別限制(稱為列舉限制)中,指定System.Enum一個型態參數是列舉型別。

內建實值類型

C# 提供下列內建實值類型,也稱為「簡單類型」

所有簡單型別都是結構型。 它們與其他結構類型不同的是,允許進行某些額外的操作:

  • 您可以使用常值來提供簡單類型的值。
    例如, 'A' 是型態 char的文字, 2001 是型別 int的文字,且 12.34m 是型別 decimal的文字。

  • 你可以用 const 關鍵字宣告簡單型態的常數。
    例如,您可以定義 const decimal = 12.34m
    你不能宣告其他結構型態的常數。

  • 如果常數運算式的運算元全部都是簡單類型的常數,則會在編譯階段進行評估。

值 Tuple 是實值類型,但不是簡單類型。

C# 語言規格

如需詳細資訊,請參閱 C# 語言規格的下列幾節:

另請參閱