C# 筆記:sealed 與 static 的用途與差異

sealedstatic 都會限制類別的使用方式,但兩者處理的是不同問題。

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 同時修改的共用狀態。

主要差異

比較項目sealedstatic
可以建立實例可以不可以
可以有建構式可以不能有一般實例建構式
可以交給 DI 管理可以通常不需要
可以被繼承不可以不可以
可以有實例成員可以不可以
主要用途固定類別的實作方式提供不需要物件狀態的共用功能

最簡單的記法是:

sealed 是「可以建立物件,但不准繼承」;static 是「不需要建立物件,直接使用類別功能」。
Author image
關於 Richard Zheng
About me 喜歡爬山,瑜伽,溜冰,喜歡新奇的事,最喜歡的還是寫程式帶來的成就感,對於資訊會不斷的出現新事物也能抱持好奇與熱忱。近期開始將學習的心得寫在Blog,發現思路更清晰也加深了記憶。 紙上得來終覺淺,絕知此事要躬行