類別聲明與存取修飾詞
// 預設 internal (組件內可見)
class InternalClass { }
// 公開 (跨組件可見)
public class PublicClass { }
// 抽象 (不可實例化,供繼承)
abstract class AbstractBase { }
// 密封 (不可繼承)
sealed class SealedLeaf { }
- 巢狀類別可用
private/protected/private protected。
- 所有類別隱含繼承
System.Object (ToString、Equals、GetHashCode...)。
方法
存取修飾詞
| 修飾詞 | 可見範圍 |
private | 類別內部 (預設) |
protected | 類別內部 + 衍生類 |
internal | 同一組件 |
protected internal | 同一組件 或 衍生類 (OR) |
private protected | 同一組件 且 衍生類 (AND, C# 7.2+) |
public | 任何地方 |
靜態 vs 實例方法
class MathUtil
{
public static int Add(int a, int b) => a + b; // 類別呼叫: MathUtil.Add(1,2)
public int Multiply(int a, int b) => a * b; // 實例呼叫: new MathUtil().Multiply(1,2)
}
- 靜態方法屬於型別,無
this,不可存取實例成員。
- 實例方法屬於物件,有
this 參考。
欄位
class FieldDemo
{
public int PublicField; // 公開欄位 (不建議,破壞封裝)
private int _privateField; // 私有欄位
public static int StaticField; // 靜態欄位 (類別級)
public const double PI = 3.14159; // 常數 (編譯期常數,隱含 static)
public readonly int _id; // 唯讀 (執行期常數,可在建構函式賦值)
public FieldDemo(int id) => _id = id;
}
const vs readonly 深度比較
| 特性 | const | readonly |
| 初始化 | 聲明時 (編譯期) | 聲明時或建構函式 (執行期) |
| 靜態性 | 隱含 static | 實例或靜態 (static readonly) |
| 型別限制 | 值型別、string、null | 任何型別 |
| 版本影響 | 修改需重編譯呼叫端 | 僅重編譯定義組件 |
屬性
完整屬性語法
class Person
{
private string _name;
public string Name
{
get => _name;
set => _name = value?.Trim() ?? throw new ArgumentNullException();
}
}
自動實作屬性 (C# 3+)
public string Name { get; set; } // 可讀寫
public string Nickname { get; private set; } // 唯讀 (外部不可設)
public int Age { get; init; } // 僅初始化可設
public string Id { get; } = Guid.NewGuid().ToString(); // 唯讀 + 初始化運算式
屬性 vs 欄位 選擇指南
- 永遠優先屬性:封裝、驗證、通知、序列化、繫結、介面定義、除錯監看。
- 欄位僅用於:私有實作細節、極效能敏感熱路徑、
ref/out 參數需求、互操作結構體。
唯讀屬性模式
// 僅 get
public string FullName => $"{FirstName} {LastName}"; // 運算式主體 (C# 6+)
// init 存取子
public DateTime CreatedAt { get; init; } // 物件初始化器可設,之後不可變
// 建構函式注入
public class Order
{
public int Id { get; }
public Order(int id) => Id = id;
}
物件初始化器語法
var p = new Person
{
Name = "John",
Age = 30
}; // 相當於建立後設定屬性
總結
類別是 C# 封裝的基本單位。掌握存取修飾詞控制可見性、靜態/實例區分生命週期、屬性封裝欄位實現資料保護、const/readonly正確表達常數語意、自動實作屬性減少樣板代碼,是寫出專業 C# 代碼的基石。