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

时间:2008-10-09 09:26:23

标签: c# .net clr language-features command-line-interface

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

那些定义在哪里?

6 个答案:

答案 0 :(得分:51)

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

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

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

答案 1 :(得分:22)

PDF of ECMA-335,分区II,第22节,“元数据保留名称字符串,由编译器或代码生成器创建,不变。基本上,它对待 每个字符串都是不透明的blob。特别是,它保留了案​​例。 CLI对存储在元数据中的名称长度没有限制,随后由CLI“。

处理

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

答案 2 :(得分:16)

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

我没有查看过CLI规范,但我知道它的限制性略低于C#规范,因为C#编译器使用“不可言喻”的名称来表示匿名方法 - 这些通常包括尖括号,它们在CLI但在C#中无效。

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

  

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

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

答案 3 :(得分:8)

根据“Expert .NET 2.0 IL Assembler”(Serge Lidin,Apress)中的各个地方,功能性CIL / CLR限制是以UTF-8编码的1,023字节。引号:

第122页:

  

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

第126页:

  

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

第143页:

  

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

第144页:

  

[TypeRef Table] [run time] Name和Namespace条目引用的字符串的总长度不得超过1,023字节。

第186页:

  

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

答案 4 :(得分:0)

查看分区II元数据文档,它指出标识符是ID或SQSTRING

ID被描述为

  

连续的字符串   以字母开头   字符或“_”,“$”,“@”或   “?”然后是任意数量的   字母数字字符或任何“_”,   “$”,“@”或“?”

这意味着没有长度限制。

答案 5 :(得分:0)

Visual Studio 2015(更新3) - C#6

最大班级名称长度= 993 个字符

    public class AaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaAAAAAZZZ
{            
}

如果你要再添加1个字符,它就不能编译,而且错误列表也是空的!

编辑:对于VS2013 Update 3的同事,班级名称限制= 1012 。不知道原因。