Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在.net中,命名空间可以拥有的类的数量有限制吗?_C#_.net_Asp.net_Vb.net - Fatal编程技术网

C# 在.net中,命名空间可以拥有的类的数量有限制吗?

C# 在.net中,命名空间可以拥有的类的数量有限制吗?,c#,.net,asp.net,vb.net,C#,.net,Asp.net,Vb.net,在.net中,命名空间可以拥有的类的数量有限制吗?此外,建议名称空间中应该有多少个类?据我所知,没有这样的限制,就像您可以拥有的类的数量没有限制一样 名称空间只是类全名的一部分。没有指定“每个名称空间”的最大类数——名称空间实际上只是类型全名的一部分,而不是CLR中的逻辑实体 建议的数字是有意义的:使用名称空间将逻辑上相关的类分组在一起 我确信,如果您有足够的类型,您可以在内存不足的情况下运行编译器或运行时,但这是一个物理限制,而不是一个规范——而且它们是否在同一命名空间中可能并不重要 请注意,

在.net中,命名空间可以拥有的类的数量有限制吗?此外,建议名称空间中应该有多少个类?

据我所知,没有这样的限制,就像您可以拥有的类的数量没有限制一样


名称空间只是类全名的一部分。

没有指定“每个名称空间”的最大类数——名称空间实际上只是类型全名的一部分,而不是CLR中的逻辑实体

建议的数字是有意义的:使用名称空间将逻辑上相关的类分组在一起

我确信,如果您有足够的类型,您可以在内存不足的情况下运行编译器或运行时,但这是一个物理限制,而不是一个规范——而且它们是否在同一命名空间中可能并不重要


请注意,正如Steven指出的,您也可以在多个程序集中使用相同的命名空间。

没有限制。类型的数量取决于问题域。如果某个“文件夹”有多个类型,你就有自由了。在我的应用程序中,我有一个特定协议中消息的名称空间,我有大约200种不同的消息类型

可能存在物理限制,也可能不存在物理限制,但在达到物理限制之前,您应该很好地达到逻辑限制


至于“应该有多少”,答案和.Net中的大多数一样是“视情况而定”。对此没有明确的答案-基本上,您希望在逻辑上将解决方案划分为与功能或目的相关的项目-无论在您的特定情况下有何意义,以及您的特殊爱好。

您始终可以在任何给定名称空间中创建包含更多类的新程序集。没有一个编译器可以强制执行全局限制。

好吧,类名必须适合字符串。只有一些有效的字符,因此将其作为一个非常粗略的猜测,即850000,因为我不必费心去计算UCS中不同类中的字符数,这将在一个字符长度名称的名称空间中给出85000x10737418213的限制!x10737418213!。但是,VB.NET只能处理1023个字符的名称,因此将其限制为85000x1021!x1021!而C#只能处理511个字符长的名称,所以是85000x509!x509

我没有.NET4.0框架,所以现在计算这些方程所需的大型数值计算太复杂了,根本不需要麻烦;)

85000可能还算不错,但表意字符通常在Lo类中,这在类名中是允许的,并且它们填充了分配的代码点的很大一部分。在任何情况下,无论实际值是多少,这都会随着以后的Unicode版本而增加


无论如何,在这一点之前,所有形式的技术限制,甚至物理限制都会被击中,但在那之前,我们达到了有目的的限制。编译器不存在名称空间,人类存在名称空间。如果没有名称空间,并且编码器保证永远不会重用名称,那么编译器也可以处理(事实上,也许更好)。名称空间的存在使人类能够合理地处理(可学习的)类型组。

我尝试过:我刚刚构建了一个包含1000000个类型的程序集,没有任何问题。然而,在5000000时,C#编译器内存不足:-)。

我确信这将被掩埋,但dll中可以包含的类数量非常有限。说

如果使用元数据标记在元数据表中标识了一个类,并且元数据标记是一个四字节的数字,这意味着程序集可以包含的类的数量小于3字节上的最大数量(第一个字节是到元数据表类型的连接)。3个字节上的最大数字为2^24–1或16777215

因此,.NET程序集可以包含的类(和类成员)的最大数量为16777215


你为什么要问?。。。我的钱没有限制,也没有推荐的数目。这取决于你的项目。我是在一次技术面试中被问到这个问题的。我猜面试官只是想了解你是否具备.NET代码封装的基本知识。如果您试图给出一个实际的数字作为答案(当然,除非您知道实际的数字),这表明您忽略了一个要点,即名称空间可以拥有的类的数量可能无关紧要,并且没有简单地知道如何很好地封装代码那么重要。至少,我希望这就是面试官想要的。我不确定我是否愿意为那些期望得到这个问题的实际数字答案的人工作。@Ben我也对这个问题感到惊讶。我只是回答说,据我所知,没有限制。对此,面试官回答说有一个限度。。自己检查一下。所以我把问题贴在这里。看看所有的回复,我似乎是对的。现在是我所在时区的傍晚休息时间。此外,如果这是一个非常缓慢的一天,我会得到一个有效的名称开始和名称部分字符的准确计数,这样做更准确。对于那些感兴趣的人,Wolfram Alpha报告说85000x509!x509!只有2323个小数位长:)所以你只需要创建大约10E+2293个皮秒的名称,因为大爆炸很快就会有达到这个极限的危险。这样的代码显然应该在大约20亿年前被重构。@Stevan。。。所以可以说,一个名称空间可以拥有的类的数量没有限制。。。但是有内存限制可以影响它。@HotTester:我相信它可以。假设C#编译器没有崩溃并生成一个巨大的dll。CLR必须仍然能够在内存中加载类型。CLR做这件事很懒,但是,所有使用的类都将在内存中保持JIT状态,直到进程结束。然而,很难将其计入CLA的数量