C#/ CLI标识符的最大长度是多少?
名称还有哪些其他限制(除了范围内明显的唯一性)?
那些定义在哪里?
从ECMA-335的PDF ,分区II,第22节“元数据保留名称字符串,由编译器或代码生成器创建,未更改。基本上,它将每个字符串视为不透明的blob。特别是,它保留了大小写。 CLI对存储在元数据中并随后由CLI处理的名称长度没有限制“。
如果我已正确读取并且上下文正确,那么CLR中的标识符长度没有实际限制。
除了其他答案之外,Microsoft Visual C#编译器接受的最大标识符长度为511个字符 。 可以使用以下代码测试:
class Program { private static void Main(string[] args) { int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa = 5; } }
变量名的长度有511个字符。 此代码编译,但如果名称中添加了一个字符,则编译器输出error CS0645: Identifier too long
。
C#语言规范定义了Unified C#3.0规范的2.4.2节中的标识符。 基本上它是“字母或下划线”,后跟任意数量的“字母,十进制数字,连接字符,组合字符,格式化字符”。 要使用关键字作为标识符,您需要将@放在前面,例如int @int = 5;
我没有查看CLI规范,但我知道它比C#规范的限制性略低,因为C#编译器对匿名方法使用“难以言喻”的名称 – 这些通常包括尖括号,它们在CLI中有效但是在C#中无效。
编辑:C#规范中没有明确的名称长度限制,但2.4.2节确实有一个保留:
包含两个连续下划线字符(U + 005F)的标识符保留供实现使用。 例如,实现可能会提供以两个下划线开头的扩展关键字。
换句话说,它是特定于实现的,关于以__
开头的特定标识符是否有效。 (有些编译器可能将__foo
作为扩展关键字,有些可能不会。)
根据“Expert .NET 2.0 IL Assembler”(Serge Lidin,Apress)中的各个地方,function性CIL / CLR限制为1,023字节,以UTF-8编码。 行情:
页面122:
ILAsm中任何一种名称的长度不受语法限制,但元数据规则对名称长度施加了某些限制。
第126页:
公共语言运行库对完整的类名长度施加了限制,指定它不应超过UTF-8编码中的1,023个字节。 但是,ILAsm编译器不会强制执行此限制。 单引号,如果它们用于ILAsm中的简单名称,则是一种纯粹的词汇工具,不会使其成为元数据; 因此,它们不会影响全class名的总长度。
页面143:
[TypeDef Table] Name和Namespace条目引用的字符串的总长度不得超过1,023个字节。
页面144:
[TypeRef Table] [运行时] Name和Namespace条目引用的字符串的总长度不得超过1,023字节。
页面186:
[方法表]名称(#Strings流中的偏移量)。 方法的名称(不包括方法所属的类的名称)。 此条目必须在UTF-8编码中索引长度不超过1,023字节的非零长度的字符串。
查看Partition II元数据文档,它指出标识符是ID或SQSTRING
ID被描述为
一个连续的字符串,以字母字符或“_”,“$”,“@”或“?”之一开头,后跟任意数量的字母数字字符或任何“_”,“$”, “@“, 要么 ”?”
这意味着没有长度限制。
Visual Studio 2015(更新3) – C#6
最大类名长度= 993个字符
public class AaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaAAAAAZZZ { }
如果你要再添加1个字符,它就不能编译,而且错误列表也是空的!
编辑:对于VS2013 Update 3的同事,class级名称限制= 1012 。 不知道原因。