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

本文关键字:多少 CLI 标识符 | 更新日期: 2023-09-27 17:47:22

除了作用域内明显的唯一性之外,名称还有哪些其他限制?

这些定义在哪里?

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

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

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

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

摘自 ECMA-335 第 II 分区第 22 节的 PDF:

元数据保留由编译器或代码生成器创建的名称字符串不变。 从本质上讲,它对待每个字符串作为不透明 blob。 特别是,它保留了大小写。 CLI 对存储在元数据中并随后由 CLI 处理的名称长度没有限制

如果我正确阅读了此内容并且上下文正确,则 CLR 中标识符的长度没有实际限制。

C#

语言规范在统一 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 汇编程序"(Serge Lidin,Apress)中的不同位置,功能性 CIL/CLR 限制为 1,023 字节,以 UTF-8 编码。引号:

第122页:

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

第126页:

公共语言运行库对完整的类名长度施加了限制,指定在 UTF-8 编码中不应超过 1,023 个字节。但是,ILAsm 编译器不强制实施此限制。单引号(如果它们用于 ILAsms 中的简单名称)是一种纯粹的词法工具,不会进入元数据;因此,它们不构成完整类名的总长度。

第143页:

[TypeDef 表] 名称和命名空间条目引用的字符串的总长度不得超过 1,023 字节。

第144页:

[类型引用表] [运行时] 名称和命名空间条目引用的字符串的总长度不得超过 1,023 字节。

第186页:

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

> Visual Studio 2015 (update 3) - C# 6

最大类名长度 = 993 个字符

    public class AaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaAAAAAZZZ
{            
}

如果您再添加 1 个字符,它不会编译,令人惊讶的是错误列表也是空的!

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

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

ID 被描述为

连续的字符串 以字母开头 字符或"_"、"$"、"@"或"_"、"$"、"@"或"之一 "?",后跟任意数量的 字母数字字符或"_"中的任何一个, "$"、"@"还是"?"

这意味着没有长度限制。