2010-08-09 7 views
13

Czy istnieje limit liczby klas, które przestrzeń nazw może mieć w .net? Dalej jaka jest zalecana liczba klas, które powinny znajdować się w przestrzeni nazw?Czy istnieje limit liczby klas, które przestrzeń nazw może mieć w .net?

+0

Dlaczego pytasz ? ... Moje pieniądze są bez limitu i nie ma zalecanej liczby. To zależy od twojego projektu. – Fosco

+0

Zostałem poproszony o to pytanie w wywiadzie technicznym. – HotTester

+2

Zobacz także [Idealna liczba klas na gałąź przestrzeni nazw] (http://stackoverflow.com/questions/146316/ideal-number-of-classes-per-namespace-branch) – Constantin

Odpowiedz

23

Próbowałem go: Właśnie zbudowałem zespół zawierający 1.000.000 typów bez problemu. Jednak przy 5 000 000 kompilator C# zabrakło pamięci :-).

+16

+1 za zabrakło pamięci w kompilatorze C#. : o) –

+0

@Stevan ... więc można powiedzieć, że nie ma ograniczeń co do liczby klas, które mogą mieć przestrzenie nazw ... ale są ograniczenia pamięci, które mogą to zrobić. – HotTester

+1

@HotTester: Wierzę, że może. Załóżmy, że kompilator C# nie zawiesił się i wyprodukował jedną gigantyczną bibliotekę dll. CLR musi nadal móc ładować typy do pamięci. CLR robi to leniwie, ale wszystkie używane klasy pozostaną JITted w pamięci, aż proces zginie.Jednak bardzo trudno jest to zliczyć w wielu klasach, ponieważ zwykle klasy będą znacznie większe od pustych typów klasy C {}, które skompilowałem w moim eksperymencie. przy okazji prawdopodobnie moglibyśmy ustalić maksymalną liczbę typów w zespole, ale ponieważ pojedyncza przestrzeń nazw nie jest ograniczona do pojedynczego zespołu, ta kwota byłaby praktycznie nieograniczona. – Steven

5

O ile mi wiadomo, nie ma takiego limitu, tak samo jak nie ma limitu liczby klas, jakie możesz mieć.

Przestrzeń nazw jest po prostu częścią pełnej nazwy klasy.

27

Nie ma określonej maksymalnej liczby klas „per nazw” - przestrzeń nazw jest naprawdę tylko częścią pełnej nazwy typu, a nie logiczną całość w CLR

Zalecana liczba jest cokolwiek ma sens: Redakcyjne przestrzenie nazw, aby grupować razem logicznie powiązane klasy.

Jestem pewien, że jeśli masz wystarczająco dużo typów, możesz uruchomić kompilator lub środowisko wykonawcze z pamięci, ale to jest fizyczny limit, a nie specyfikacja - i prawdopodobnie nie ma znaczenia, czy są one w tym samym obszarze nazw lub nie.

Zauważ, że jak wskazuje Steven, możesz mieć również tę samą przestrzeń nazw w wielu złożeniach.

+0

Darn. Pokonaj mnie. +1. – David

+0

Ty też mnie pokonałeś! :-) – DaveDev

+2

Nie zapominaj, że chociaż może być maksymalna liczba typów na zestaw, pojedyncza przestrzeń nazw może być rozłożona na nieograniczoną liczbę złożeń, przez co liczba typów w tej przestrzeni nazw jest praktycznie nieograniczona. – Steven

3

Bez limitu. Liczba typów zależy od domeny problemu. Jeśli określony "folder" jest tylu typów, masz dowolność. W mojej aplikacji mam przestrzeń nazw dla wiadomości w określonym protokole i mam około 200 różnych typów wiadomości.

3

Może istnieć lub nie być fizyczny limit, ale przed dotarciem do niego należy osiągnąć logiczny limit.

Co do "ile powinno być", odpowiedź, jak większość w .Net, jest "to zależy". Nie ma jednoznacznej odpowiedzi na to pytanie - w zasadzie chcesz logicznie podzielić swoje rozwiązanie na projekty związane z funkcjonalnością lub celem - niezależnie od tego, co ma sens w twoim przypadku i dla twoich upodobań.

2

Zawsze można utworzyć nowy zestaw z większą liczbą klas w dowolnej przestrzeni nazw. Żaden kompilator nie może praktycznie wymusić globalnego limitu.

2

Cóż, nazwa klasy musi pasować do napisu. Jest tylko kilka poprawnych znaków, więc podając to jako bardzo szorstkie przypuszczenie jako 850000, ponieważ nie mogę sobie pozwolić na uzyskanie liczby znaków w różnych klasach w LUW, byłoby to w przestrzeni nazw o długości jednego znaku - daj limit 850000x10737418213! x10737418213 !. Jednak VB.NET może działać tylko z nazwami o rozmiarze 1023 znaków, więc ograniczyłby je do 850000x1021! X1021! i C# może obsługiwać tylko 511 znaków o długości, więc 85000x509! x509!

nie mają .NET4.0 ramy, więc big-numeryczny matematyki potrzebne do pracy z tych równań jest zbyt compliated zajmować się teraz;)

85.000 to chyba dobrze off, ale ideograficzne znaki są na ogół w klasie Lo, co jest dozwolone w nazwach klas i wypełniają bardzo duży fragment przypisanych punktów kodowych. W każdym razie, niezależnie od tego, jaka będzie prawdziwa wartość, wzrośnie z późniejszymi wersjami Unicode.

Wszelkie ograniczenia techniczne, a nawet fizyczne zostaną trafione przed tym punktem, ale droga, zanim to osiągniemy celowy limit. Przestrzeń nazw nie istnieje dla kompilatora, istnieje dla ludzi. Kompilator mógłby poradzić sobie równie dobrze (a może lepiej), gdyby nie było przestrzeni nazw i koderów, gwarantujących, że nigdy nie użyją ponownie nazw. Przestrzenie nazw istnieją dla ludzi, którzy mają do czynienia z typowymi rozmiarami (z rozmysłem wielkości).

+0

Powolny dzień, panie Hanna? :) –

+2

To wieczorny czas chillout w mojej strefie czasowej. Poza tym, gdyby to był naprawdę powolny dzień, zdobyłbym dokładną liczbę poprawnych nazwisk i nazw części i zrobiłem to znacznie dokładniej. –

+1

Dla zainteresowanych, Wolfram Alpha informuje, że 850000x509! X509! jest tylko 2323 cyfr dziesiętnych :) – Constantin

9

Jestem pewien, że to zostanie pochowane, ale istnieje BARDZO skończona liczba klas, które możesz mieć w bibliotece dll. This source mówi, że

Jeśli klasa jest identyfikowany w tabeli metadanych za pomocą tokena metadanych oraz token metadanych jest szereg czterech bajtów, oznacza to, że liczba klas, które zespół może zawierać jest mniejsza niż największa numer na 3 bajty (pierwszy bajt jest połączeniem z typem tabeli metadanych). Największa liczba na 3 bajtach wynosi 2^24- 1 lub 16777215.

Zatem maksymalna liczba klas (i klas), że członkowie zespołu mogą zawierać .NET jest 16777215.

+0

Nie rozumiem wszystkich odpowiedzi "bez ograniczeń" za pomocą upvotes. Jak ludzie sądzą, że klasy są przywoływane po tym, jak są JITed? To jest poprawna odpowiedź. –

+0

@MikeMarynowski: Pierwotne pytanie dotyczyło liczby klas w * przestrzeni nazw *. Ta odpowiedź stanowi oświadczenie o liczbie typów w zespole *. Choć technicznie poprawne, odpowiada na inne pytanie. Odpowiedzi "brak teoretycznego limitu" są bardziej trafne i równie poprawne. – stakx

+0

@stakx Pytanie nie pytało o teoretyczny limit, ale dla rekordu 16777215 IS jest teoretycznym limitem opartym na specyfikacji CLI. Praktycznym ograniczeniem jest jednak dużo pamięci do tej pory. Ta odpowiedź jest w praktyce jedyną, która ma znaczenie. Od pytania nie jest jasne, czy chciał wiedzieć tylko dla zabawy, czy dlatego, że musiał podjąć decyzję projektową w oparciu o ile klas mógł mieć, w takim przypadku jest to odpowiedź, której szuka. –

Powiązane problemy