2010-08-09 11 views
13

Gibt es ein Limit für die Anzahl der Klassen, die ein Namespace in .net haben kann? Was ist die empfohlene Anzahl von Klassen, die in einem Namespace vorhanden sein sollten?Gibt es eine Begrenzung für die Anzahl der Klassen, die ein Namespace in .net haben kann?

+0

ist Warum sind Sie gefragt ? ... Mein Geld ist da, es gibt keine Begrenzung und keine empfohlene Nummer. Es hängt von Ihrem Projekt ab. – Fosco

+0

Ich wurde diese Frage in einem technischen Interview gestellt. – HotTester

+2

Siehe auch [Ideale Anzahl von Klassen pro Namespace-Zweig] (http://stackoverflow.com/questions/146316/ideal-number-of-classes-per-namespace-branch) – Constantin

Antwort

23

Ich habe es ausprobiert: Ich habe gerade eine Baugruppe mit 1.000.000 Typen ohne Probleme gebaut. Bei 5.000.000 hat der C# -Compiler jedoch nicht genug Speicher :-).

+16

+1, damit der C# -Compiler nicht mehr genügend Arbeitsspeicher hat. : o) –

+0

@Stevan ... also kann man sagen, dass es keine Begrenzung für die Anzahl der Klassen gibt, die ein Namespace haben kann ... aber es gibt Speicherbeschränkungen, die dies bewirken können. – HotTester

+1

@HotTester: Ich glaube es kann. Angenommen, der C# -Compiler stürzte nicht ab und produzierte eine gigantische DLL. Die CLR muss immer noch in der Lage sein, Typen im Speicher zu laden. Die CLR macht dies träge, aber alle verwendeten Klassen bleiben JIT im Speicher, bis der Prozess abbricht.Es ist jedoch sehr schwierig, dies in der Anzahl der Klassen zu zählen, da normalerweise Klassen viel größer sind als die leeren 'Klasse C {}' -Typen, die ich in meinem Experiment kompiliert habe. Übrigens könnten wir vielleicht die maximale Anzahl von Typen in einer Assembly bestimmen, aber da ein einzelner Namespace nicht auf eine einzelne Assembly beschränkt ist, wäre diese Menge praktisch unbegrenzt. – Steven

5

Soweit ich weiß, gibt es keine solche Beschränkung, so wie es keine Begrenzung für die Anzahl der Klassen gibt, die Sie haben können.

Der Namespace ist einfach Teil des vollständigen Namens der Klasse.

27

Es gibt keine festgelegte maximale Anzahl der Klassen „pro Namensraum“ - ein Namespace ist wirklich nur ein Teil des vollständigen Namen des Typs, nicht eine logische Einheit in den CLR

Die empfohlene Anzahl, was Sinn macht, ist: Verwendung Namespaces, um logisch zusammengehörige Klassen zu gruppieren.

Ich bin sicher, dass wenn Sie genug Typen haben, können Sie den Compiler oder die Laufzeit nicht genügend Arbeitsspeicher ausführen, aber das ist eine physikalische Grenze nicht eine Spezifikation - und es ist wahrscheinlich egal, ob sie im gleichen Namespace oder sind nicht.

Beachten Sie, dass Steven darauf hinweist, dass in mehreren Assemblies auch der gleiche Namespace vorhanden sein kann.

+0

Darn. Beat mich dazu. +1. – David

+0

du schlägst mich auch! :-) – DaveDev

+2

Vergessen Sie nicht, dass, während es eine maximale Anzahl von Typen pro Assembly geben könnte, ein einzelner Namespace über eine unbegrenzte Anzahl von Assemblys verteilt sein könnte, was die Anzahl der Typen in diesem Namespace praktisch unbegrenzt macht. – Steven

3

Keine Begrenzung. Die mögliche Anzahl der Typen hängt von der Problemdomäne ab. Wenn ein bestimmter "Ordner" so viele Typen hat, hast du Freiheit. In meiner Anwendung habe ich einen Namensraum für Nachrichten in einem bestimmten Protokoll und ich habe etwa 200 verschiedene Nachrichtentypen.

3

Es mag oder darf kein physisches Limit sein, aber Sie sollten eine logische Grenze erreichen, bevor Sie dorthin kommen.

Wie für "wie viele es sein sollte", ist die Antwort, wie die meisten in .Net, "es kommt darauf an." Es gibt keine klare Antwort darauf - im Grunde möchten Sie Ihre Lösung logisch in Projekte aufteilen, die sich nach Funktionalität oder Zweck richten - was auch immer in Ihrem speziellen Fall und für Ihren speziellen Geschmack sinnvoll ist.

2

Sie können immer eine neue Assembly mit mehreren Klassen in einem beliebigen Namespace erstellen. Kein Compiler kann praktisch ein globales Limit durchsetzen.

2

Nun, ein Klassenname muss in eine Zeichenfolge passen. Es gibt nur ein paar gültige Zeichen, also grob geschätzt als 850000, weil ich nicht daran interessiert bin, die Anzahl der Charaktere in verschiedenen Klassen im UCS zu zählen, würde dies - in einem Namensraum mit einem Zeichenlangennamen - Gib ein Limit von 850000x10737418213! x10737418213 !. VB.NET kann jedoch nur mit Namen von 1023 Zeichen arbeiten, so dass es auf 850000x1021! X1021 beschränkt ist! und C# kann nur 511 Zeichen lange Namen behandeln, also 85000x509! x509!

Ich habe keinen .NET4.0 Rahmen, so dass die große numerische Mathematik diese Gleichungen benötigt, um funktionieren zu ist compliated mit jetzt zu stören;)

Die 85000 ist wahrscheinlich gut aus, aber ideographic Zeichen befinden sich im Allgemeinen in der Lo-Klasse, die in Klassennamen zulässig ist, und sie füllen einen sehr großen Teil der zugewiesenen Codepunkte aus. In jedem Fall wird dies unabhängig von dem tatsächlichen Wert mit späteren Unicode-Versionen erhöht.

Alle möglichen technischen und sogar physikalischen Grenzen werden vor diesem Punkt sowieso getroffen, aber so weit, viel früher haben wir die zweckmäßige Grenze erreicht. Der Namespace existiert nicht für den Compiler, er existiert für die Menschen. Der Compiler könnte genauso gut (in der Tat vielleicht besser) arbeiten, wenn es keine Namespaces und Codierer gäbe, die garantiert nie Namen wiederverwenden würden. Es gibt Namespaces für Menschen, die vernünftige (lernfähige) Gruppen von Typen haben, mit denen sie umgehen müssen.

+0

Langsamer Tag, Herr Hanna? :) –

+2

Es ist Abend Chillout-Zeit in meiner Zeitzone. Außerdem, wenn es ein wirklich langsamer Tag wäre, hätte ich eine genaue Anzahl von gültigen Namen-Start- und Namensteil-Zeichen erhalten und dies viel genauer gemacht. –

+1

Für die Interessierten meldet Wolfram Alpha, dass 850000x509! X509! ist nur 2323 Dezimalstellen lang :) – Constantin

9

Ich bin sicher, dass dies begraben wird, aber es gibt eine sehr begrenzte Anzahl von Klassen, die Sie in einer DLL haben können. This source sagt, dass

Wenn eine Klasse in der Metadatentabelle unter Verwendung eines Metadaten-Token und die Metadaten-Token ein Vier-Byte-Nummer identifiziert wird, bedeutet dies, dass die Anzahl der Klassen, die eine Anordnung kleiner ist als der größte enthalten Nummer auf 3 Byte (das erste Byte ist eine Verbindung zum Metadatentabellentyp). Die größte Zahl von 3 Bytes 2^24- 1 oder 16777215.

Daher ist die maximale Anzahl von Klassen (und Klassen-Mitglieder), dass eine .NET-Assembly enthalten 16777215.

+0

Ich verstehe nicht alle "no limit" Antworten mit upvotes. Wie denken Menschen, dass Klassen nach JITed referenziert werden? Dies ist die richtige Antwort. –

+0

@MikeMarynowski: Die ursprüngliche Frage nach der Anzahl der Klassen in einem * Namensraum *. Diese Antwort gibt eine Aussage über die Anzahl der Typen in einer * Assembly *. Obwohl technisch korrekt, beantwortet dies eine andere Frage. Die "no theory limit" Antworten sind mehr auf den Punkt und gleichermaßen korrekt. – stakx

+0

@stakx Die Frage hat nicht nach einer theoretischen Grenze gefragt, aber für die Aufzeichnung 16777215 ist die theoretische Grenze basierend auf der CLI-Spezifikation. Die praktische Grenze ist jedoch viel Speicher, den Sie bis zu diesem Punkt haben. Diese Antwort ist in der Praxis die einzige, die zählt. Aus der Frage ist unklar, ob er nur zum Spaß wissen wollte oder weil er eine Designentscheidung treffen musste, basierend auf der Anzahl der Klassen, die er haben könnte. In diesem Fall ist dies die Antwort, nach der er sucht. –

Verwandte Themen