2010-12-15 15 views
16

Próbuję zrozumieć modyfikator dostępu wewnętrznego w języku C#. Nie mogę zrozumieć, co dokładnie jest zbiorem i jaka część mojego programu odbywa się w tym zespole. Starałem się zrobić to tak, że zmienna jest przystępnie tylko przez obiekty w następującym nazw:C# assemblies, co w zespole?

namespace Engine.Entity 

Zmienna w pytaniu jest zdefiniowana w klasie wewnątrz tej przestrzeni nazw, więc zakłada się, czy zrobiłem to wewnętrzny, tylko obiekty wewnątrz tej przestrzeni nazw mają do niego dostęp. Widzę assemblie i przestrzenie nazw jako jedno i nie sądzę, że to prawda.

+2

Proszę spojrzeć na program ".Net Reflector". To pozwoli ci otworzyć zespół i zobaczyć, co w nim jest. Zobaczysz, że pojedynczy zespół może zawierać wiele przestrzeni nazw. – David

Odpowiedz

19

Przestrzenie nazw wpływają tylko na rozpoznawanie nazw. Przestrzenie nazw nie implikują żadnego rodzaju przestrzeni dyskowej, ani przestrzeni nazw nie określają, które biblioteki DLL zawierają twój kod. Przestrzenie nazw umożliwiają grupowanie powiązanych obiektów pod nazwą logiczną, nawet jeśli fizycznie znajdują się w różnych bibliotekach DLL.

Zespół jest w zasadzie zwykłym plikiem DLL lub EXE. Zawiera kod IL i informacje o typie, które opisują kod w tej bibliotece DLL lub EXE. Może zawierać wiele innych rzeczy, ale na początek wystarczy pomyśleć o nim jako o DLL.

Umieszczasz kod w konkretnym zestawie, kompilując kod do projektu (csproj), który tworzy bibliotekę DLL lub EXE.

Przestrzeń nazw może obejmować wiele złożeń. Oznacza to, że klasy będące członkami tej logicznej przestrzeni nazw mogą znajdować się w wielu bibliotekach DLL. Dostęp do określonej klasy w kodzie źródłowym można uzyskać tylko wtedy, gdy projekt odwołuje się do prawidłowego zestawu (DLL) zawierającego tę klasę.

Wewnętrzny modyfikator oznacza, że ​​symbol można uzyskać tylko z tego samego zestawu. Tylko kod, który jest kompilowany w tej samej bibliotece DLL, co twój kod, może uzyskać dostęp do twoich właściwości lub metod oznaczonych tagami wewnętrznymi.

+0

"Zgromadzenie to w zasadzie DLL lub EXE." To prawda, ale czasami może to być dowolny plik (pliki jpeg, pliki tekstowe, itp.) Lub kilka w tym samym czasie. Jest to jednak przypadek krańcowy (zobacz moją odpowiedź na ten post). –

+0

Tak, zespół może zawierać/zawierać cały bałagan. Nie dotyczy poziomu tego pytania. – dthorpe

1

Od internal (C# Reference)

słowa kluczowego wewnętrzny jest dostęp modyfikator dla typów i członków typu. typy wewnętrznych lub członkowie są dostępne tylko w plikach w samego zespołu

Więc oznacza to, ze w tym samym montażu/dll, nie namespace.

0

Zasadniczo nie można uczynić zmiennej widocznej tylko z podanej przestrzeni nazw. Jak ktoś może zdefiniować dowolną przestrzeń nazw, byłoby to uczynić ideę internal pustki: to po prostu trzeba napisać

namespace System 
{ 
    public static MySystemInternalSpy 
    { 
     public static void SpyInternals() 
     { 
      ... 
     } 
    } 
} 

aby uzyskać dostęp do dowolnej zmiennej, klasy lub metody określonej jako internal w przestrzeni nazw System, na przykład.

0

Przestrzenie nazw i złoŜenia nie są synonimami. Często przestrzeń nazw obejmuje kilka złożeń. Każdy kod zarządzany zbudowany z Visual Studio ma jeden za jeden odpowiadający projektom do złożeń plików binarnych DLL/EXE.

Jednak po powiązaniu zarządzanego kodu z wierszem komend można utworzyć zespół, w którym wiele plików projektu należy do jednego zestawu (co oznacza, że ​​wiele plików na dysku reprezentuje jeden zespół). Ale nieważne w tym przypadku, jest to ezoteryczna rzecz, która nigdy nie występuje w praktyce.

"Wewnętrzny" modifier dostępu oznacza po prostu, że cel można uzyskać tylko z poziomu tego zespołu. Nie ma to wpływu na przestrzenie nazw.

5

Ludzie są łatwo mylone przez rzeczy nazw/montażu, gdyż oddziela pojęcia gdzie Twój kod znajduje się fizycznie (montaż) i jak można odwołać go (logicznie odwoływać się za pomocą nazw i odniesienie fizyczna jest poprzez odniesienie zespół).

zwykle wyjaśnić używając słowa contribute:

  1. Zespół może przyczynić się do wielu nazw.
    Na przykład, zespół System.Data.dll przyczynia się do przestrzeni nazw, takich jak System.Data (na przykład klasa System.Data.DataTable) i Microsoft.SqlServer.Server (np. Klasa Microsoft.SqlServer.Server.SqlContext).

  2. Wiele złożeń może przyczynić się do pojedynczego obszaru nazw.
    Na przykład zarówno zespół System.Data.dll, jak i zespół System.Xml.dll przyczyniają się do przestrzeni nazw System.Xml.
    Oznacza to, że jeśli używasz klasy System.Xml.XmlDataDocument z projektu, musisz odwołać się do zestawu System.Data.dll.
    Jeśli używasz klasy System.Xml.XmlDocument, musisz odwołać się do System.Xml.dll z projektu.

(powyższe przykłady to .NET 4.0, ale prawdopodobnie również dla poprzednich wersji .NET).

Danny Thorpeexplained pojęcie namespace i internal naprawdę dobrze, więc nie będę wchodzić w szczegóły na temat tych.

--jeroen

+1

+1: bardzo jasne wyjaśnienie dla początkującego z C# jak ja – Guillaume07