簡體   English   中英

可以在其他命名空間中訪問內部類嗎?

[英]Can internal classes be accessed within other namespaces?

我目前正在在線閱讀這本書: http : //www.angelfire.com/theforce/chewy0/csharp/Thinking_in_C-Sharp_.pdf

在第 23 頁(PDF 文檔的第 38 頁),它指出無法從外部命名空間內的類訪問內部類。

但是,在 Microsoft 在線文檔中,它指出內部類只能從同一個程序集訪問。

https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/internal

根據我的理解,程序集可以包含來自多個命名空間的類。 這是否意味着從 Microsoft 文檔中可以跨不同的命名空間訪問內部類?

還是說內部類在其受尊重的程序集命名空間中都是私有的?

所以這是摘錄,對吧?

Java 使用五個顯式關鍵字來設置類中的邊界:public、private、protected、internal 和 protected internal。 它們的用法和含義非常簡單。 這些訪問說明符確定誰可以使用后面的定義。 public 意味着每個人都可以使用以下定義。 另一方面,private 關鍵字意味着除了您(類型的創建者)在該類型的成員函數內部之外,沒有人可以訪問這些定義。 private 是你和客戶端程序員之間的一堵磚牆。 如果有人試圖訪問私有成員,他們將收到編譯時錯誤。 受保護的行為類似於私有,除了繼承類可以訪問受保護成員,但不能訪問私有成員。 繼承將很快介紹。 internal 通常被稱為“友好的”——定義可以被同一命名空間中的其他類訪問,就好像它是公共的一樣,但不能被不同命名空間中的類訪問。 命名空間將在#ref# [sic] 一章中深入討論。 protected internal 允許相同命名空間內的類(如 internal)或繼承類(如 protected)訪問,即使繼承類不在同一命名空間內。

C# 的默認訪問,如果您不使用上述說明符之一,就會發揮作用,是內部的

筆者大概混為一談Java的internal用C#的internal

它們略有不同,因為 Java 沒有程序集; 它有包,將類組織到命名空間中。

在 c# 中,命名空間與可訪問性修飾符完全沒有關系。 只有同一程序集中的類才能訪問internal類型或成員,除非您使用InternalsVisibleTo屬性。 命名空間無關緊要。

嗯,回答這個問題的最簡單方法是測試它 - 所以我在 1 個程序集中創建了 2 個命名空間,並訪問了一個內部變量。

簡短的回答 - Microsoft 文檔是正確的 - 即使您有 2 個不同的命名空間,也可以訪問同一程序集中的內部變量。

這是代碼:

namespace ConsoleApplication1
{
    class Class1
    {
        internal string thing;
        public Class1()
        {
            thing = "original data";
        }
    }
}

namespace ConsoleApplication2
{
    class Class2
    {
        public ConsoleApplication1.Class1 class1= new ConsoleApplication1.Class1();
        public Class2()
        {
            class1.thing = "other namespace modification";
        }
    }
}

調用 Class2 構造函數時,顯示修改后的數據。

var class2 = new ConsoleApplication2.Class2();
Console.WriteLine(class2.class1.thing);

結果:

"other namespace modification"

希望這有幫助:)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM