C# 從基礎到精通 — 第 3 講
了解類別、結構、記錄和空安全
該部落格上撰寫的文章是出於教學目的而創建的。 另外,文章中的資訊可能不正確,請謹慎。
在 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 是否真的不可能。
類別、結構和記錄的選擇不是偏好問題。 你必須先決定物件的身份是否重要,值的複製是否是自然的,或者它是否是不可變的資料。