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 。 不知道原因。