我想了解C#中的內部訪問修飾符。我似乎無法理解程序集到底是什麼,程序中的程序部分是什麼部分。我試圖讓這個變量是通俗易懂只能通過物體下面的命名空間中:C#程序集,什麼是程序集?
namespace Engine.Entity
有問題的變量在該命名空間內的類定義的,所以我認爲,如果我做了它的內部,只有該名稱空間內的對象纔有權訪問它。我看到程序集和命名空間是一體的,我認爲這是不對的。
我想了解C#中的內部訪問修飾符。我似乎無法理解程序集到底是什麼,程序中的程序部分是什麼部分。我試圖讓這個變量是通俗易懂只能通過物體下面的命名空間中:C#程序集,什麼是程序集?
namespace Engine.Entity
有問題的變量在該命名空間內的類定義的,所以我認爲,如果我做了它的內部,只有該名稱空間內的對象纔有權訪問它。我看到程序集和命名空間是一體的,我認爲這是不對的。
命名空間僅影響名稱解析。命名空間並不意味着任何類型的存儲,名稱空間也不會確定哪些DLL包含您的代碼。命名空間允許你在邏輯名下將相關的東西組合在一起,儘管它們可能在物理上駐留在不同的DLL中。
程序集基本上只是一個DLL或EXE文件。它包含描述該DLL或EXE中代碼的IL代碼和類型信息。它也可以包含很多其他的東西,但對於初學者來說,只是把它看作一個DLL。
通過將代碼編譯到生成DLL或EXE的項目(csproj)中,將代碼放入特定程序集。
命名空間可以跨越多個程序集。也就是說,屬於該邏輯名稱空間成員的類可能駐留在多個DLL中。只有當您的項目引用包含該類的正確程序集(DLL)時,纔可以訪問源代碼中的特定類。
內部修飾符意味着符號只能從相同的程序集中訪問。只有與代碼編譯到同一個DLL中的代碼才能訪問使用內部標記的屬性或方法。
「程序集基本上是DLL或EXE。」沒錯,但有時它可以是任何類型的文件(jpegs,文本文件等)或同時數個。這是邊緣案例(見我對這篇文章的回答)。 – 2010-12-15 14:40:36
是的,組件可以包含/包含一堆東西。與這個問題的級別無關。 – dthorpe 2010-12-15 16:53:00
內部關鍵字是接入 改性劑的類型和類型成員。 內部類型或成員只能在在同一 裝配
文件 訪問所以這個來自同一個組件/ DLL,不namespace內表示。
基本上,你不能只在給定的命名空間內使變量可見。由於任何人都可以定義任何命名空間,這將使internal
無效的想法:你只需要編寫
namespace System
{
public static MySystemInternalSpy
{
public static void SpyInternals()
{
...
}
}
}
來訪問在System
命名空間定義爲internal
任何變量,類或方法,例如。
命名空間和程序集不是同義詞。命名空間通常跨越幾個程序集。從Visual Studio構建的任何託管代碼都有一對一對應的項目對應程序集到DLL/EXE二進制文件。但是,如果您將託管代碼與命令行關聯起來,則可以製作一個程序集,其中多個項目文件都屬於一個程序集(這意味着磁盤上的多個文件一起代表一個程序集)。但不要介意這種情況,這是一個在實踐中從未發生過的深奧的事情。
「內部」訪問修飾符僅表示目標只能從該程序集內訪問。它對命名空間沒有影響。
人們很容易被名稱空間/程序集的東西所困惑,因爲它解耦了代碼的物理位置(程序集)的概念以及如何引用它(邏輯上引用是通過使用名稱空間,物理引用是通過引用組件)。
我通常用這個詞contribute
解釋:
的組件可以促進多個命名空間。
例如,System.Data.dll
組件對諸如System.Data
(例如類別System.Data.DataTable
)和Microsoft.SqlServer.Server
(例如類別Microsoft.SqlServer.Server.SqlContext
)的命名空間有貢獻。
多個程序集可以有助於單個命名空間。
例如,System.Data.dll
程序集和System.Xml.dll
程序集均對System.Xml
名稱空間有貢獻。
這意味着如果您使用項目中的System.Xml.XmlDataDocument
類,則需要參考System.Data.dll
部件。
如果您使用System.Xml.XmlDocument
類,則需要引用項目中的System.Xml.dll
。
(上面的例子是.NET 4.0,但也可能適用於以前的.NET版本)。
Danny Thorpeexplainednamespace
和internal
的概念真的很好,所以我不會詳細討論這些。
- jeroen
+1:像我這樣的c#初學者很清楚的解釋 – Guillaume07 2012-12-24 07:17:43
看看「.Net Reflector」程序。它會讓你打開一個程序集,看看裏面有什麼。您將看到單個程序集可以包含多個名稱空間。 – David 2010-12-15 05:50:07