2010-08-09 20 views
13

¿Existe algún límite en la cantidad de clases que un espacio de nombres puede tener en .net? Además, ¿cuál es el número recomendado de clases que debería haber en un espacio de nombres?¿Existe algún límite en la cantidad de clases que un espacio de nombres puede tener en .net?

+0

¿Por qué preguntas ? ... Mi dinero está allí sin límite, y no hay un número recomendado. Depende de tu proyecto – Fosco

+0

Me hicieron esta pregunta en una entrevista técnica. – HotTester

+2

Véase también [Número ideal de clases por rama de espacio de nombres] (http://stackoverflow.com/questions/146316/ideal-number-of-classes-per-namespace-branch) – Constantin

Respuesta

23

Lo probé: acabo de construir un conjunto que contiene 1.000.000 de tipos sin ningún problema. Sin embargo, en 5.000.000 el compilador de C# se quedó sin memoria :-).

+16

+1 para hacer que el compilador de C# se quede sin memoria. : o) –

+0

@Stevan ... por lo que se puede decir que no hay límite para la cantidad de clases que puede tener un espacio de nombres ... pero hay restricciones de memoria que pueden afectarlo. – HotTester

+1

@HotTester: Creo que sí. Supongamos que el compilador de C# no falla y produce un dll gigantesco. El CLR aún debe poder cargar tipos en la memoria. El CLR hace esto vago, pero todas las clases usadas permanecerán JITted en la memoria hasta que el proceso falle.Sin embargo, es muy difícil contar esto en número de clases, porque normalmente las clases serán mucho más grandes que los tipos vacíos de 'clase C {}' que compilé en mi experimento. Por cierto, tal vez podríamos determinar la cantidad máxima de tipos en un ensamblado, pero como un solo espacio de nombres no está limitado a un solo ensamblaje, esta cantidad sería prácticamente ilimitada – Steven

5

Por lo que yo sé, no hay tal límite, de la misma manera que no hay límite en la cantidad de clases que puede tener.

El espacio de nombres es simplemente parte del nombre completo de la clase.

27

No hay un número máximo especificado de clases "por espacio de nombres" - un espacio de nombres es realmente sólo una parte del nombre completo del tipo, no es una entidad lógica en el CLR

El número recomendado es lo que tenga sentido: el uso espacios de nombres para agrupar clases relacionadas lógicamente.

Estoy seguro de que si tiene suficientes tipos puede ejecutar el compilador o el tiempo de ejecución sin memoria, pero eso es un límite físico, no una especificación, y probablemente no importe si están en el mismo espacio de nombres o no.

Tenga en cuenta que, como señala Steven, también puede tener el mismo espacio de nombres presente en varios conjuntos también.

+0

Darn. Pásame a eso. +1. – David

+0

¡me has vencido también! :-) – DaveDev

+2

No olvide que, si bien podría haber un número máximo de tipos por ensamblado, un único espacio de nombre podría distribuirse en un número ilimitado de ensamblajes, haciendo que el número de tipos en ese espacio de nombres sea prácticamente ilimitado. – Steven

3

Sin límite. El número de tipos de feasabe depende del dominio del problema. Si una cierta "carpeta" como muchos tipos tiene alguna libertad. En mi aplicación, tengo un espacio de nombres para mensajes en un protocolo determinado y tengo alrededor de 200 tipos de mensajes diferentes.

3

Puede haber o no un límite físico, pero debe alcanzar un límite lógico antes de llegar allí.

En cuanto a "cuántos debe haber", la respuesta, como la mayoría en .Net, es "depende". No hay una respuesta clara a eso; básicamente, desea dividir lógicamente su solución en proyectos relacionados por funcionalidad o propósito, lo que tenga sentido en su caso particular y para sus gustos particulares.

2

Siempre puede crear un ensamblaje nuevo con más clases en cualquier espacio de nombres dado. Ningún compilador puede aplicar prácticamente un límite global.

2

Bueno, un nombre de clase tiene que caber en una cadena. Solo hay algunos caracteres válidos, por lo que se trata de una conjetura muy aproximada, como 850000, porque no me molestaría obtener un recuento de los caracteres en diferentes clases en el UCS, esto sería - en un espacio de nombres de un nombre de longitud de carácter - dar un límite de 850000x10737418213! x10737418213 !. Sin embargo, VB.NET solo puede funcionar con nombres de 1023 caracteres, por lo que se limitaría a 850000x1021! X1021! y C# solo puede manejar nombres de 511 caracteres, ¡así que 85000x509! x509!

yo no tengo un marco .NET4.0, por lo que la matemática-numérica grande tenía que trabajar a cabo esas ecuaciones es demasiado compliated que molestarse con este momento;)

El 85000 es probable que así fuera, pero ideográfico los personajes generalmente están en la clase Lo, que está permitido en los nombres de las clases, y completan una gran porción de los puntos de código asignados. En cualquier caso, este sea cual sea el valor real aumentará con las versiones posteriores de Unicode.

Todo tipo de límites técnicos e incluso físicos serán alcanzados antes de este punto de todos modos, pero mucho, mucho antes de eso, alcanzamos el límite determinado. El espacio de nombres no existe para el compilador, existe para los humanos. El compilador podría funcionar igual de bien (de hecho, quizás mejor) si no hubiera espacios de nombres y los programadores simplemente garantizaran nunca reutilizar los nombres. Existen espacios de nombres para que los seres humanos tengan grupos de tipos de tamaño razonable (de tamaño de aprendizaje) con los que lidiar.

+0

Día lento, Sr. Hanna? :) –

+2

Es la hora de descanso de la tarde en mi zona horaria. Además, si fuera un día realmente lento, habría obtenido un recuento exacto de caracteres válidos de inicio de nombre y parte de nombre y lo hubiera hecho de forma mucho más precisa. –

+1

Para aquellos interesados, Wolfram Alpha informa que 850000x509! X509! tiene solo 2323 dígitos decimales :) – Constantin

9

Estoy seguro de que esto será enterrado, pero hay un número MUY finito de clases que puede tener en un dll. This source dice que

Si una clase se identifica en la tabla de metadatos mediante un token de metadatos y el token de metadatos es un número de cuatro bytes, esto significa que el número de clases que una asamblea puede contener es más pequeño que el mayor número en 3 bytes (el primer byte es una conexión al tipo de tabla de metadatos). El mayor número de 3 bytes es 2^24 1 ó 16777215.

Por lo tanto, el número máximo de clases (y miembros de clases) que un ensamblado de .NET puede contener es 16777215.

+0

No entiendo todas las respuestas "sin límite" con votos ascendentes. ¿Cómo piensan las personas que las clases están referenciadas después de ser JITed? Esta es la respuesta correcta. –

+0

@MikeMarynowski: la pregunta original sobre el número de clases en un * espacio de nombres *. Esta respuesta hace una declaración sobre la cantidad de tipos en * ensamblaje *. Aunque técnicamente correcto, esto responde una pregunta diferente. Las respuestas "sin límite teórico" son más precisas e igualmente correctas. – stakx

+0

@stakx La pregunta no preguntó acerca de un límite teórico, pero para el registro 16777215 ES el límite teórico basado en la especificación CLI. Sin embargo, el límite práctico es la cantidad de memoria que tiene hasta ese momento. Esta respuesta en la práctica es la única que importa. A partir de la pregunta, no está claro si quería saber solo por diversión o porque tenía que tomar una decisión de diseño basada en cuántas clases podría tener, en cuyo caso esta es la respuesta que está buscando. –

Cuestiones relacionadas