遇過不少 .NET 工程師,都知道 C# 存取修飾詞有四種,public
、protected
、private
及internal
。
前三種大部都可以很輕易的回答出來,但知道internal
的工程師比例卻不高。
本篇來幫大家複習一下 C# 的存取修飾詞 internal
。
存取範圍
internal
的存取範圍是相同組件(Assembly)都可以使用,白話一點講就是internal
可以在同一個dll
內存取。
- 類別預設的存取修飾詞是
internal
。 - 類別成員預設的存取修飾詞是
private
。
protected internal
internal
可以跟protected
合在一起使用,存取範圍就變成:
相同組件 或 子類別都可以存取。
如下範例:
1 | namespace AssemblyA |
Friend Assembly
為了符合封裝原則,基本上我們不太希望把不該開放的類別或成員給外部的組件存取,但為了測試專案,不開放存取權限又顯得很難做事。
這時候我們可以透過 InternalsVisibleTo
開放特定的組件也能存取internal
修飾詞的類別或成員。
例如我們有 AssemblyA 及 AssemblyA.Tests 專案,我們希望 AssemblyA.Tests 專案可以存取 AssemblyA 專案的internal
類別或成員。
打開 AssemblyA 專案底下的 Properties\AssemblyInfo.cs 檔案編輯:
1 | using System.Runtime.CompilerServices; |
以上設定並不是把 AssemblyA 及 AssemblyA.Tests 變成同組件,而是:
AssemblyA.Tests 可以存取 AssemblyA 的
internal
類別及成員。
AssemblyA 依然不可以存取 AssemblyA.Tests 的internal
類別及成員。