← SEARCHABLE ARCHIVE
C# · 2026-07-21

C# 從基礎到精通 — 第 3 講

了解類別、結構、記錄和空安全

INTERACTIVE READING MODE →

該部落格上撰寫的文章是出於教學目的而創建的。 另外,文章中的資訊可能不正確,請謹慎。

在 C# 中,資料可以表示為類別、結構和記錄。 即使語法相似,複製方法和同一性的意思也不同,所以必須根據目的來選擇。

類別是引用型

public sealed class Player
{
    public string Name { get; }
    public int Health { get; private set; }

    public Player(string name, int health)
    {
        Name = name;
        Health = health;
    }
}

Player first = new("Rose", 100);
Player second = first;

在第二種情況下,複製指向同一物件的引用,而不是整個物件。 如果您更改一側的生命值,您可以在另一側看到更改後的結果。

struct 是一個值類型

public readonly struct Position
{
    public float X { get; }
    public float Y { get; }

    public Position(float x, float y)
    {
        X = x;
        Y = y;
    }
}

當您指派一個結構時,該值將被複製。 它適用於較小且被視為單一值的數據,例如座標或顏色。

大型結構具有更高的複製成本,且可變結構可能會產生不可預測的行為。 結構體不一定很快。

record 自己比較值

public sealed record ItemKey(int Id, string Grade);

var a = new ItemKey(10, "Rare");
var b = new ItemKey(10, "Rare");

Console.WriteLine(a == b); // True

一般類別基本上是比較引用是否相同,而記錄則是比較配置值是否相同。 它非常適合與不可變資料(例如設定、命令和網路訊息)一起使用。

將類型標記為可為空

Player? FindPlayer(int id)
{
    return players.TryGetValue(id, out Player? player)
        ? player
        : null;
}

Player? target = FindPlayer(10);
if (target is not null)
{
    Console.WriteLine(target.Name);
}

使用可為空的引用類型,您可以區分可為空的引用和不可為空的引用。 在使用 ! 清除警告之前,您需要再次檢查流程,看看 null 是否真的不可能。

類別、結構和記錄的選擇不是偏好問題。 你必須先決定物件的身份是否重要,值的複製是否是自然的,或者它是否是不可變的資料。