C#提供多種存取修飾詞,用於控制類型和成員的可見性與可訪問性。
正確使用存取修飾詞是實現封裝原則的重要方式。
主要存取修飾詞
public
最寬鬆的存取層級,沒有存取限制。
- 可見性: 任何其他程式碼都可以存取該類型或成員
- 使用場景: 設計為被外部程式碼廣泛使用的API
private
最嚴格的存取層級,限制在宣告的類型內部使用。
- 可見性: 只有在宣告它的類型內部可見
- 使用場景: 隱藏實作細節,防止外部程式碼直接存取內部資料
protected
允許宣告類型及其衍生類型存取。
- 可見性: 只能在宣告它的類型內部及衍生類別中存取
- 使用場景: 允許子類別重用或覆寫功能,同時對外部程式碼隱藏
internal
限制在同一組件(Assembly)內使用。
- 可見性: 只在當前組件(.dll或.exe)內可見
- 使用場景: 允許組件內的程式碼協作,但防止外部組件存取
protected internal
結合了
protected
和internal
,允許在同一組件中或衍生類別中存取。- 可見性: 可在當前組件中的任何程式碼存取,或在任何組件中的衍生類別存取
- 使用場景: 建立可由同一組件內的程式碼或衍生類別使用的框架功能
private protected (C# 7.2+)
限制在同一組件中的衍生類別使用。
- 可見性: 只能在宣告類型的同一組件中的衍生類別內部存取
- 使用場景: 限制功能只能由同一組件中的衍生類別使用
存取修飾詞比較表
修飾詞 | 同一類別 | 衍生類別(同一組件) | 非衍生類別(同一組件) | 衍生類別(不同組件) | 非衍生類別(不同組件) |
public | ✓ | ✓ | ✓ | ✓ | ✓ |
protected | ✓ | ✓ | ✗ | ✓ | ✗ |
internal | ✓ | ✓ | ✓ | ✗ | ✗ |
protected internal | ✓ | ✓ | ✓ | ✓ | ✗ |
private protected | ✓ | ✓ | ✗ | ✗ | ✗ |
private | ✓ | ✗ | ✗ | ✗ | ✗ |
預設存取修飾詞
如果未指定存取修飾詞,C#會使用以下預設值:
內容 | 預設修飾詞 |
命名空間中的類別、結構、介面、列舉 | internal |
類別和結構的成員 | private |
介面成員 | public (不可更改) |
列舉成員 | public (不可更改) |
最佳實踐
- 最低權限原則:總是使用限制最嚴格的存取修飾詞,只公開必要的成員
- 隱藏實作細節:使用
private
隱藏內部實作細節
- 公開的API:只將穩定且設計好的API標記為
public
- 組件內部合作:使用
internal
限制跨組件訪問
- 繼承考量:只在需要讓衍生類別訪問或覆寫時使用
protected
- 測試可訪問性:考慮使用
[InternalsVisibleTo]
特性允許測試組件存取internal
成員