C# 屬性:初學者的全面指南

你好,未來的編程超級巨星!今天,我們將踏上一段令人興奮的旅程,探索 C# 屬性的世界。別擔心如果你之前從未寫過一行代碼——我將成為你的友好導遊,我們將一步步攻克這個主題。在這個教學的結束時,你將成為屬性方面的專家!

C# - Properties

屬性是什麼?

在我們深入之前,讓我們想象你有一個存錢罐。你可以將錢放入其中,也可以取出錢,但你不能直接訪問存錢罐的內部。C# 的屬性與此類似——它們提供了一種方式來訪問和修改類中私有字段的值,同時仍然保持對訪問方式的控制。

為什麼使用屬性?

  1. 封裝:它們幫助隱藏類的內部工作方式。
  2. 靈活性:你可以更改數據的存儲方式,而不需要更改其訪問方式。
  3. 驗證:你可以在設置數據之前添加檢查,以確保數據有效。

現在,讓我們來動手寫一些代碼!

基本屬性語法

這裡是最簡單的屬性形式:

public class Person
{
private string name;

public string Name
{
get { return name; }
set { name = value; }
}
}

在這個例子中,Name 是我們的屬性。它與私有字段 name 相關聯。getset 部分被稱為訪問器。

訪問器

屬性有兩個主要的訪問器:

  1. get:检索屬性的值
  2. set:為屬性分配一個新值

讓我們分解我們的 Name 屬性:

public string Name
{
get { return name; } // 這是取得器
set { name = value; } // 這是設置器
}

當你訪問屬性(例如,person.Name)時,會調用取得器。當你分配一個值(例如,person.Name = "John")時,會調用設置器。

自動實現的屬性

C# 為簡單的屬性提供了一種簡寫,這些屬性不需要任何特殊邏輯:

public class Person
{
public string Name { get; set; }
}

這會創建一個具有隱藏後備字段的屬性 Name,由 C# 管理這個後備字段。這就像魔法一樣!

帶有邏輯的屬性

現在,讓我們為我們的屬性添加一些魅力:

public class BankAccount
{
private decimal balance;

public decimal Balance
{
get { return balance; }
set
{
if (value < 0)
{
throw new ArgumentException("餘額不能為負");
}
balance = value;
}
}
}

在這裡,我們確保餘額永遠不能為負。如果有人嘗試設置一個負的餘額,我們將抛出一個異常。這就像為你的存錢罐請了一個保鏢!

讀取器和寫入器屬性

有時候,你可能想要限制對你的屬性的訪問:

public class SecretAgent
{
private string codeName = "007";

// 讀取器屬性
public string CodeName
{
get { return codeName; }
}

// 寫入器屬性
public string Mission
{
set { Console.WriteLine($"新任務: {value}"); }
}
}

詹姆斯·邦德會對這種保密程度感到滿意!

表達式體屬性

對於簡單的屬性,C# 6.0 引入了一種更簡潔的語法:

public class Circle
{
public double Radius { get; set; }

// 使用表達式體的讀取器屬性
public double Area => Math.PI * Radius * Radius;
}

=> 語法就像是在說 "這個屬性由以下表達式定義"。它簡潔、甜蜜且具有數學性!

抽象屬性

在抽象類中,你可以定義抽象屬性,派生類必須實現它們:

public abstract class Shape
{
public abstract double Area { get; }
}

public class Square : Shape
{
public double Side { get; set; }

public override double Area => Side * Side;
}

這就像為屬性創建了一個藍圖,你的 "子" 類必須填寫。

屬性方法表

這裡是一個屬性相關方法的便捷表格:

方法 描述 示例
get 检索屬性值 get { return name; }
set 設置屬性值 set { name = value; }
init 只在對象初始化時設置屬性值 public string Name { get; init; }
value 在設置器中表示被分配的值 set { if (value != null) name = value; }

結論

恭喜你!你剛剛踏入了 C# 屬性的世界。記住,屬性就像是你類中私有字段的訓練有素的管家——它們管理訪問、執行規則並保持整潔。

隨著你編程旅程的繼續,你會發現屬性到處都是。它們是編寫乾淨、可維護 C# 代碼的重要部分。繼續練習,很快你將會像專家一樣使用屬性!

快樂編程,願你的屬性永遠受到妥善保護!??‍??‍?

Credits: Image by storyset