C#/CLI 标识符的最大长度是多少
本文关键字:多少 CLI 标识符 | 更新日期: 2023-09-27 17:47:22
除了作用域内明显的唯一性之外,名称还有哪些其他限制?
这些定义在哪里?
除了其他答案之外,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# 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 被描述为
连续的字符串 以字母开头 字符或"_"、"$"、"@"或"_"、"$"、"@"或"之一 "?",后跟任意数量的 字母数字字符或"_"中的任何一个, "$"、"@"还是"?"
这意味着没有长度限制。