Jestem bardzo zdezorientowany między przestrzeniami nazw i zestawami. Czy System.Data
i System.Web
przestrzenie nazw lub zestawy?
Zauważyłem, że są to nazywane przestrzenie nazw i jednocześnie są obecne w GAC_32
folderze. Więc co to właściwie jest?
c#
.net
namespaces
assemblies
user3125433
źródło
źródło
Odpowiedzi:
System.Data
jest przestrzenią nazw ,System.Data.DLL
(plik) jest zestawem .Przestrzeń nazw to logiczna grupa typów (głównie w celu uniknięcia kolizji nazw). Zestaw może zawierać typy w wielu przestrzeniach nazw (
System.DLL
zawiera kilka ...), a pojedyncza przestrzeń nazw może być rozmieszczona w zespołach (npSystem.Threading
.).źródło
namespace
(lub jej odpowiednika w innym języku .NET) w kodzie źródłowym, który jest kompilowany w celu utworzenia zestawu. Zauważ, że drugi zestaw może ponownie otworzyć przestrzeń nazw i dodać do niej więcej klas.Przestrzeń nazw to logiczna grupa klas należących do tej samej funkcjonalności. A więc
System.Web
iSystem.Data
są przestrzeniami nazwMSDN opisuje to jako:
Assembly to fragment (prekompilowanego) kodu, który może być wykonywany przez środowisko wykonawcze .NET. Zawiera jedną lub więcej przestrzeni nazw. Program .NET składa się z co najmniej jednego zestawu.
System.Web.dll
iSystem.Data.dll
są zgromadzeniami.MSDN opisuje to jako:
źródło
W skrócie:
Montaż:
Zespół zapewnia podstawową jednostkę fizycznego grupowania kodu, jest to jednostka wyjściowa. Jest to jednostka wdrażania i jednostka wersjonowania. Zestawy zawierają kod MSIL.
Przestrzeń nazw:
Przestrzeń nazw stanowi podstawową jednostkę logicznego grupowania kodu.Jest to zbiór nazw, w których każda nazwa jest unikalna, tworząc logiczną granicę dla grupy klas. Przestrzeń nazw musi być określona we właściwościach projektu.
źródło
W skrócie:
Porady.
Zestaw zawiera kolekcję typów (na przykład l'assembly System zawiera wiele przestrzeni nazw, w tym System, System.IO, ecc). Zwykle nazwa zestawu jest taka sama, jak przestrzeń nazw, którą zawiera, ale nie zawsze.
Inny przykład zestawów i przestrzeni nazw.
Zespół 1 ( CoreAssembly.DLL )
Zawiera przestrzenie nazw Namespace1.subnamespace1
Zespół 2 ( ExtensionCoreAssembly.DLL )
Zawiera przestrzenie nazw Namespace1.subnamespace1
Możliwe jest użycie nazwy zestawu zawierającego różne przestrzenie nazw i rozszerzenie istniejącego zestawu innym zestawem za pomocą tej techniki.
DEFINICJE.
Zespoły
Zestaw to zbiór typów i zasobów, który tworzy logiczną jednostkę funkcjonalności. Wszystkie typy w .NET Framework muszą istnieć w zestawach; środowisko uruchomieniowe języka wspólnego nie obsługuje typów poza zestawami. Za każdym razem, gdy tworzysz aplikację Microsoft Windows®, usługę Windows, bibliotekę klas lub inną aplikację w języku Visual Basic .NET, tworzysz pojedynczy zestaw. Każdy zestaw jest przechowywany jako plik .exe lub .dll. Uwaga Chociaż technicznie możliwe jest tworzenie zespołów obejmujących wiele plików, prawdopodobnie nie będziesz używać tej technologii w większości sytuacji.
Przestrzenie nazw
Innym sposobem organizacji kodu w języku Visual Basic .NET jest użycie przestrzeni nazw. Przestrzenie nazw nie zastępują zestawów, ale drugą metodą organizacyjną, która uzupełnia zestawy. Przestrzenie nazw to sposób grupowania nazw typów i zmniejszania ryzyka kolizji nazw. Przestrzeń nazw może zawierać zarówno inne przestrzenie nazw, jak i typy. Pełna nazwa typu obejmuje kombinację przestrzeni nazw, które zawierają ten typ.
Link: http://msdn.microsoft.com/en-us/library/ms973231.aspx
źródło
Są to przestrzenie nazw. Zespoły zawierają więcej niż jedną przestrzeń nazw, na przykład:
System.dll
zawiera te przestrzenie nazw (i więcej):Również jedna przestrzeń nazw może zawierać zagnieżdżone przestrzenie nazw. Są to tylko logiczne nazwy służące do organizowania kodu. Pamiętaj, że
DLL
pliki to zestawy, które zawierają przestrzenie nazw.GAC
to Global Assembly Cache . Według MSDN:Tak powszechnie stosowane zespoły przechowywanych w
GAC
i w związku z tym nie ma potrzeby, aby skopiować wszystkie pliki montażowe do katalogu projektu, które odwołują się ze swoimi zespołami project.The przechowywanych wGAC
to Strong-Named assemblies.Normally po dodaniu odwołanie do zespół z projektu, który nie jestStrong-Named
kopią swojego.dll
pliku zostanie utworzony nabin\Debug
folder..If chcesz można zrobić (projektu biblioteki klasy na przykład) montaż Strong-Named.See: Jak: Zaloguj się zespół z Strong Nazwaźródło
Inni udzielili bardzo dobrych i szczegółowych odpowiedzi na to pytanie. Ale chcę zaznaczyć, że jeśli nie masz pewności, możesz zajrzeć do MSDN. Biblioteka MSDN wyjaśnia bardzo jasno i prosto przestrzeń nazw i zestaw, w którym znajduje się dany typ. Podaje nawet nazwę pliku,
(in System.Data.dll)
więc nie ma dwuznaczności.źródło
Plik, który widzisz w GAC
System.Data.dll
, jest zestawem i zawiera przestrzenie nazw, w tymSystem.Data
. Jeśli wyświetlisz właściwości odwołania w programie Visual Studio, zobaczysz:Później, jeśli klikniesz prawym przyciskiem myszy odniesienie i wybierzesz widok w przeglądarce obiektów, zobaczysz przestrzenie nazw w tym konkretnym zestawie.
źródło
Jak mówi @amdluigi: „Zazwyczaj nazwa zestawu jest taka sama, jak przestrzeń nazw, którą zawiera, ale nie zawsze”.
Powyżej znajduje się zrzut ekranu pliku System.Data.dll w przeglądarce obiektów w Studio. To doskonały przykład, aby zbadać te kwestie. Należy zauważyć, że większość przestrzeni nazw zawartych w zestawie to System.Data lub podprzestrzeń nazw System.Data.
Ogólnie rzecz biorąc, dobrą praktyką jest powiązanie nazw zestawów z przestrzeniami nazw w nich zawartymi. Zauważ, że gdy Studio po raz pierwszy tworzy projekt w celu skompilowania zespołu, jedna z właściwości projektu jest domyślną przestrzenią nazw. Na początku Studio nadaje domyślnej przestrzeni nazw taką samą nazwę, jak sam projekt. Jeśli kiedykolwiek zdecydujesz się zmienić nazwę projektu, rozważ również zmianę jego domyślnej przestrzeni nazw.
Istnieją dwie dodatkowe przestrzenie nazw: Microsoft.SqlServer jest zrozumiały. Niektóre typy SQL Server, których nie chcieli pakować w osobnym zestawie.
Ale o co chodzi z System.Xml ???? Istnieje zestaw System.Xml.dll. Dlaczego ta przestrzeń nazw jest również wyświetlana w pliku System.Data.dll?
Zauważ, że zestaw może ponownie otworzyć przestrzeń nazw i dodać do niej więcej - dokładnie to robi System.Data.dll z przestrzenią nazw System.Xml.
Powodem jest to, że przestrzenie nazw mają zerowy wpływ na wydajność, ale zestawy bardzo dużo. Jeśli masz 1000 klas ze znaczną ilością kodu, nie chcesz jednego zestawu z bardzo dużym zużyciem pamięci. Nie chcesz też mieć 1000 zespołów z jedną klasą. Każdy zestaw musi zostać załadowany do pamięci, zanim jego zawartość będzie mogła zostać wykonana. Chcesz, aby zestaw zawierał rozsądną liczbę wzajemnie powiązanych klas, więc gdy aplikacja załaduje zestaw w celu uzyskania jednej z jego klas, pobierze inne klasy, których aplikacja prawdopodobnie będzie potrzebować za darmo. Ziarnistość jest ważna: nie za duża, nie za mała, w sam raz.
Zwróć uwagę, że System.Data.dll ponownie otwiera System.Xml i dodaje dokładnie jedną klasę: XmlDataDocument. Zdarza się, że ta klasa służy do interpretacji danych relacyjnych jako dokumentu XML. Jeśli twoja aplikacja używa tylko XML, nie będzie potrzebować tej klasy. Jeśli Twoja aplikacja zajmuje się danymi relacyjnymi, może tak. Więc chociaż XmlDataDocument dziedziczy po XmlDocument i znajduje się w przestrzeni nazw System.Xml, jest spakowany w zestawie System.Data.dll.
Wszystko to jest szczególnie ważne, jeśli masz doświadczenie w Javie, gdzie istnieje tylko jedna koncepcja, pakiet. W .NET są dwa, zestaw i przestrzeń nazw. Te dwa są ortogonalne. Zestaw może oczywiście zawierać więcej niż jedną przestrzeń nazw. Zestaw może ponownie otworzyć przestrzeń nazw i dodać do niej więcej - innymi słowy, typy w przestrzeni nazw mogą obejmować więcej niż jeden zestaw.
źródło
Zespół to fizyczne grupowanie jednostek logicznych, Przestrzeń nazw, logiczne grupowanie klas.
Przestrzeń nazw może obejmować wiele zestawów
źródło