当前位置:  开发笔记 > 编程语言 > 正文

C#/ CLI标识符的最大长度是多少?

如何解决《C#/CLI标识符的最大长度是多少?》经验,为你挑选了4个好方法。

名称还有哪些其他限制(除了范围内明显的唯一性)?

那些定义在哪里?



1> qwertium..:

除了其他答案之外,Microsoft Visual C#编译器接受的最大标识符长度为511个字符.这可以使用以下代码进行测试:

class Program
{
    private static void Main(string[] args)
    {
        int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa = 5;
    }
}

变量名的长度有511个字符.此代码编译,但如果名称中添加了一个字符,则编译器输出error CS0645: Identifier too long.


这些似乎不再是这种情况了,至少在Visual Studio 2015中使用了编译器.我尝试了一个16,000个字符的标识符,只是警告名称对于PDB来说太长了.所以调试会受到阻碍,但它应该运行良好.

2> Rob..:

从ECMA-335的PDF,分区II,第22节"元数据保留名称字符串,由编译器或代码生成器创建,不变.基本上,它将每个字符串视为不透明的blob.特别是,它保留了大小写. CLI对存储在元数据中并随后由CLI处理的名称长度没有限制.

如果我已正确读取并且上下文正确,那么CLR中的标识符长度没有实际限制.


@fearofawhackplanet:磁盘效率更低.但是在正常的程序执行期间不使用元数据,因此它不会真正影响运行时性能.

3> Jon Skeet..:

C#语言规范定义了Unified C#3.0规范的2.4.2节中的标识符.基本上它是"字母或下划线",后跟任意数量的"字母,十进制数字,连接字符,组合字符,格式化字符".要使用关键字作为标识符,您需要将@放在前面,例如int @int = 5;

我没有看过CLI规范,但我知道它比C#规范的限制性略低,因为C#编译器对匿名方法这样的东西使用"难以言喻"的名称 - 这些通常包括尖括号,它们在CLI中有效但是在C#中无效.

编辑:C#规范中没有明确的名称长度限制,但2.4.2节确实有一个保留:

包含两个连续下划线字符(U + 005F)的标识符保留供实现使用.例如,实现可能会提供以两个下划线开头的扩展关键字.

换句话说,它是特定于实现的,以特定标识符开头__是否有效.(有些编译器可能有__foo扩展关键字,有些可能没有.)



4> Dono..:

根据"Expert .NET 2.0 IL Assembler"(Serge Lidin,Apress)中的各个地方,功能性CIL/CLR限制为1,023字节,以UTF-8编码.行情:

第122页:

ILAsm中任何一种名称的长度不受语法限制,但元数据规则对名称长度施加了某些限制.

页面126:

公共语言运行库对完整的类名长度施加了限制,指定它不应超过UTF-8编码中的1,023个字节.但是,ILAsm编译器不会强制执行此限制.单引号,如果它们用于ILAsm中的简单名称,则是纯粹的词汇工具,不会使其成为元数据; 因此,它们不会影响全班名的总长度.

页面143:

[TypeDef Table] Name和Namespace条目引用的字符串的总长度不得超过1,023个字节.

页面144:

[TypeRef Table] [运行时] Name和Namespace条目引用的字符串的总长度不得超过1,023字节.

页面186:

[方法表]名称(#Strings流中的偏移量).方法的名称(不包括方法所属的类的名称).此条目必须在UTF-8编码中索引长度不超过1,023字节的非零字符串.


这可能就是为什么511个字符标识符在C#编译器中抛出错误的原因,因为每个字符都是一个双字节并且是1022个字节,我想有几个字节的开销会使它超过1,023的限制.
如果它们不能超过UTF-8中的1023个字节,则每个字符不是双字节值,而是通常为1个字节(主要使用US-ASCII),每个符号最多6个字节.当然,你可以使用各种组合符号作为"字符",所以它非常复杂.尽管如此,UTF-8中的511个字符并不总是加起来为1022个字节.
推荐阅读
oDavid_仔o_880
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有