最大方法名称长度
Posted
技术标签:
【中文标题】最大方法名称长度【英文标题】:Maximum Method Name Length 【发布时间】:2010-09-30 08:55:47 【问题描述】:有没有人碰巧知道在您选择的编程语言中方法名称的最大长度是多少?我打算把这个问题作为一个 C# 特定的问题,但我认为了解整个范围会很好。
还涉及哪些因素:
语言规范有限制吗? 编译器将其限制在什么范围内? 在 32 位和 64 位机器上有何不同?【问题讨论】:
我很想知道您为什么需要这个问题的答案 大声笑,主要是好奇。我和一位同事正在编写一些单元测试方法,其中一个特别冗长(远低于任何限制),但我们对允许的最大长度很感兴趣。 好的-只是检查-我认为它是这样的。我唯一遇到这样的事情是 VC6 中针对具有 STL 的调试版本的愚蠢警告消息 - 符号名称超过 256 个字符或其他内容,因此它们将被截断。 @Tim:我必须每天忍受数以万计的警告...... 我有一个项目,我在其中看到错误消息的符号名称已损坏,足以刷新 5000 行的回滚缓冲区。但那是 Uber 模板元数据。 【参考方案1】:对于 C#,我不相信有 指定 硬限制。 (例如,C# 5 规范的第 2.4.2 节没有给出限制。)Roslyn v2.2.0.61624 似乎有 1024 个字符的限制;这远远超出了可读性的范围,甚至是一个合理的机器生成名称。
对于 Java,section 3.8 of the spec 声明:
标识符是无限长的 Java字母和Java的序列 数字,其中第一个必须是 Java 字母。
【讨论】:
您的回答似乎与 Kirill Osenkov 和 DLeh 的 511 回答相矛盾。如果您有 C# 声明的参考资料会很好,因为我认为您在这里错了... @SerjSagan:我刚试过,它比 511 大,尽管有 个限制。我会说它仍然大于可读性和合理的机器生成名称的范围。我将在此时使用精确的限制进行编辑...【参考方案2】:php 似乎只受脚本内存限制的限制。
使用 128Mb,我能够创建一个包含 400 万个字符的类(和方法)。
<?php
ini_set('memory_limit', '128M');
$i = 1024 * 1024;
while ($i < 10000000)
$className = str_repeat('i', $i);
eval("class $className public function $className() echo '$i<br>'; ");
new $className();
$i *= 2;
?>
【讨论】:
【参考方案3】:我刚刚在 C# Visual Studio 2010 (x64) 中做了一个测试:做了一个标识符:
int a123456789a123...;
然后重复。在 512 个字符处,VS 给了我错误“标识符太长”。不过511还不错。 (检查 Word 中的字符数。)
另一个例子:
int whyintheworldwouldyoueverhaveanidenfifierthislongitsreallyjustquiteridiculousimeancmonyoucouldatleasthavethecommoncourtesyofmakingitcamelcasesoitsnotsohardtoreadcmonjuststopnowyourereallyreachingtomakethisaslongaspossiblearentyou123412341234alrightwellthatsenoughnowisntitwelliguessnotbecauseimstillgoingthisisofficallytheworstidentifiereverಠ_ಠokaynowthatithasunicodeitsofficialbutseriouslythisthingissolongthatihadtogetupinthemiddleofittotakeabreakbeforesittingdowntofinishtoppingitofftothemaxcharlimitof___511;
【讨论】:
【参考方案4】:微软的C#实现是511,VB.NET实现是1023。
Visual Studio 只会对标识符的前 511 个(对于 VB 为 1023 个)字符进行着色,其余部分保持黑色。
【讨论】:
您的回答似乎与 John Skeet 的回答相矛盾。如果您有关于 511 的 C# 声明的参考,那就太好了【参考方案5】:在 C# 中是 511 个字符的长度。
【讨论】:
IDE 可能会对行施加一些限制,但 C# 规范没有施加任何限制。 编译器,而不是 IDE。不过,IDE 只会为名称的前 511 个字符着色,其余部分保持黑色。【参考方案6】:常见的 Lisp 符号的名称是字符串;字符串的长度限制为array-dimension-limit
array-dimension-limit
的值是一个正整数,它是数组的每个单独维度的上界。这个界限取决于实现,但不会小于 1024。(鼓励实现者在不牺牲性能的情况下使这个限制尽可能大。)
实际上这可能会很大
Welcome to Clozure Common Lisp Version 1.3-dev-r11583M-trunk (DarwinX8664)!
? array-dimension-limit
72057594037927936
?
Welcome to Clozure Common Lisp Version 1.3-dev-r11583M-trunk (DarwinX8632)!
? array-dimension-limit
16777216
?
这个答案忽略了方法名的包名;这可以加倍长度。
【讨论】:
【参考方案7】:进行中 (OpenEdge) 限制为 32 个字符。
【讨论】:
【参考方案8】:在 D 中,我不知道是这种情况,但我怀疑它是像 >100MB 这样的疯狂的东西。这可能是内存不足的事情。这是基于知道我和其他人遇到了符号名称大约 11kB 的目标文件格式限制,并且该问题已得到修复。
【讨论】:
【参考方案9】:在 Java 中,我相信没有给出长度限制。 See this from the online Sun Java Tutorial:
变量名区分大小写。变量的名称可以是任何合法标识符——无限长度的 Unicode 字母和数字序列,以字母开头......
和上面的其他人一样,我猜长度取决于可用内存。
【讨论】:
以上是关于最大方法名称长度的主要内容,如果未能解决你的问题,请参考以下文章
Java 虚拟机原理Class 字节码二进制文件分析 六 ( 属性类型 | Code 属性 | 属性名称索引 | 属性长度 | 操作数栈最大深度 | 局部变量存储空间 | 字节码长度 )