今天想不起C#中類的預設存取修飾詞是internal了還以為是public呢,單元測試時候一直是黃色敬告。所以把csdn的東西翻出了(在百度上搜不到的)。當用internal修飾類(c#預設不加修飾符就是internal)可能會出現問題:當你在繼承或者是執行個體化一個internal類的時候你的存取權限不能打破原來internal類的訪問限制。例:internal class A{} public class B:A{}是不允許的; public class C{ public A a=new A();}是不允許的. msdn參考:存取修飾詞(C# 編程指南)
所有類型和類型成員都具有可訪問性層級,用來控制是否可以在您程式集的其他代碼中或其他程式集中使用它們。您在宣告類型或成員時使用以下存取修飾詞之一來指定其可訪問性:
-
public (可以修飾類)
-
同一程式集中的任何其他代碼或引用該程式集的其他程式集都可以訪問該類型或成員。
-
private (成員的預設存取修飾詞)
-
只有同一類或結構中的代碼可以訪問該類型或成員。
-
protected
-
只有同一類或結構或者衍生類別中的代碼可以訪問該類型或成員。
-
internal (可以修飾類,類的預設修飾符)
-
同一程式集中的任何代碼都可以訪問該類型或成員,但其他程式集中的代碼不可以。
-
protected internal
-
同一程式集中的任何代碼或其他程式集中的任何衍生類別都可以訪問該類型或成員。
下面的樣本示範如何為類型和成員指定存取修飾詞:
不是所有存取修飾詞都可以在所有上下文中由所有類型或成員使用,在某些情況下類型成員的可訪問性受到其包含類型的可訪問性的限制。以下各節提供了有關可訪問性的更多詳細資料。
類和結構的可訪問性
直接在命名空間中聲明的類和結構(即,沒有嵌套在其他類或結構中的類和結構)可以是公用類和結構,也可以是內部類和結構。如果不指定存取修飾詞,則預設為 internal。嵌套的類和結構還可以聲明為私人類和結構。不可以從包含類型訪問私人巢狀型別。
衍生類別的可訪問性不能高於其基底類型。換句話說,不能有從內部類 A 派生的公用類 B。如果允許這種情況,將會使 A 成為公用類,因為 A 的所有受保護的成員或內部成員都可以從衍生類別訪問。
可以使用 InternalsVisibleToAttribute 使其他某些程式集能夠訪問您的內部類型。有關更多資訊,請參見friend 組件(C# 編程指南)。
類成員和結構成員的可訪問性
可以使用五種訪問類型中的任何一種來聲明類成員(包括嵌套的類和結構)。結構成員無法聲明為受保護的成員,因為結構不支援繼承。
成員的可訪問性決不能高於其包含類型的可訪問性。例如,在內部類型中聲明的公用方法只具有內部可訪問性。
如果類或結構的成員為屬性、欄位、方法、事件或委託,並且該成員是某個類型或具有參數或傳回值類型,則該成員的可訪問性不能超過該類型。例如,如果 C 不是公用類,則不能返回類 C 的公用方法 M。同樣,如果 A 聲明為私人,則類型 A 不能有受保護的屬性。
使用者定義的運算子必須始終聲明為公用運算子。有關更多資訊,請參見 operator(C# 參考)。
解構函式不能具有可訪問性修飾符。
若要設定類成員或結構成員的存取層級,請向該成員聲明添加適當的關鍵字。下面是一些樣本:
| 說明: |
protected internal 可訪問性的意思是受保護“或”內部,而不是受保護“和”內部。換句話說,可以從同一程式集內的任何類(包括衍生類別)中訪問 protectedinternal 成員。若要限制為只有同一程式集內的衍生類別可以訪問,請將類本身聲明為內部,並將其成員聲明為受保護。 |
其他類型
直接用命名空間聲明時,可以將介面聲明為公用介面或內部介面,並且與類和結構一樣,介面預設具有內部可訪問性。介面成員始終是公用成員,因為介面的用途是讓其他類型能夠訪問某個類或結構。存取修飾詞不能應用於介面成員。
枚舉成員始終是公用的,不能應用任何存取修飾詞。
預設情況下,委託預設具有內部存取層級。