sealed 和 static 都會限制類別的使用方式,但兩者處理的是不同問題。
sealed:不允許被繼承
在類別前加上 sealed,代表這個類別已經是完整實作,不開放其他類別繼承或改寫。
public sealed class RequestTimingMiddleware
{
public RequestTimingMiddleware(RequestDelegate next)
{
// 建構式
}
}sealed 類別仍然可以:
- 建立實例
- 使用建構式
- 包含實例欄位與方法
- 交給 DI 容器管理
它只是不允許其他類別繼承:
// 編譯失敗
public class CustomMiddleware : RequestTimingMiddleware
{
}適合用在不打算提供擴充點的 Service、Middleware 或其他完整實作。
static:不需要建立實例
static 類別不能使用 new 建立實例,所有成員也必須是靜態成員。
public static class TimeFormatter
{
public static string Format(DateTime value)
{
return value.ToString("O");
}
}呼叫時直接使用類別名稱:
var result = TimeFormatter.Format(DateTime.UtcNow);static 常用於無狀態的工具方法、格式轉換或擴充方法。不適合拿來保存會被不同 Request 同時修改的共用狀態。
主要差異
| 比較項目 | sealed | static |
|---|---|---|
| 可以建立實例 | 可以 | 不可以 |
| 可以有建構式 | 可以 | 不能有一般實例建構式 |
| 可以交給 DI 管理 | 可以 | 通常不需要 |
| 可以被繼承 | 不可以 | 不可以 |
| 可以有實例成員 | 可以 | 不可以 |
| 主要用途 | 固定類別的實作方式 | 提供不需要物件狀態的共用功能 |
最簡單的記法是:
sealed是「可以建立物件,但不准繼承」;static是「不需要建立物件,直接使用類別功能」。
