【问题标题】:.Net / CLR Identifiers.Net / CLR 标识符
【发布时间】:2011-07-19 08:12:54
【问题描述】:

我想知道,.Net 标识符中接受哪些字符?

不是 C# 或 VB.Net,而是 CLR。​​

我问这个的原因是我在查看 yield return 语句是如何实现的 (C# In Depth),并看到它编译成如下代码:

public int <count>5__1;

还有其他我可以使用的标识符字符吗?此代码不会公开。

【问题讨论】:

    标签: .net clr identifier


    【解决方案1】:

    这受 CLS 规范第 8.5.1 章“有效名称”的约束:

    CLS 规则 4:组件应遵循技术报告 15 的附件 7 Unicode 标准 3.0 管理允许的字符集 开始并包含在标识符中,可在线获取 http://www.unicode.org/unicode/reports/tr15/tr15-18.html。身份标识 应采用 Unicode 规范化形式定义的规范格式 C. 对于 CLS 而言,如果两个标识符的小写字母相同,则它们是相同的 映射(由 Unicode 语言环境不敏感、一对一指定) 小写映射)是相同的。也就是说,对于两个标识符 在 CLS 下被认为不同,它们的差异应超过 只是他们的情况。但是,为了覆盖继承的 定义 CLI 需要对原始文件进行精确编码 使用声明。

    或者换句话说,它没有指定 verboten 字符列表,它只关心能够比较字符串而不会感到意外。这是 CLR 必须做的所有事情。编译器的工作要困难得多,它必须能够识别程序中的标记,这是词法分析器的工作。实用的词法分析器实现为标识符中的有效字符设置规则。例如,不是以数字开头的标识符。

    【讨论】:

    • 好答案,但请注意这是指定 CLS 要求,而不是 CLR 要求。
    • 我知道的任何 CLR 实现都遵循 CLS 规则。
    • 我不认为这是完全正确的; CLS 规则指示了 CLR 行为的一个受限子集,如果需要与其他语言进行互操作,编译器应该将其作为目标(参见规范第 I 部分的第 7 节)。但是,CLR 明确支持不符合 CLS 的类型,并且规范特别提到在程序集之外不可见的类型不需要遵循 CLS 规则。
    • 一些规则本身也说明了这一点。例如,规则 5 规定“在符合 CLS 的范围中引入的所有名称都应独立于种类而不同,除非名称相同并通过重载解析。也就是说,虽然 CTS 允许单个类型使用相同的名称对于方法和字段,CLS 没有。”
    • 您可以尝试创建一个违反此规则的类型(例如通过 Reflection.Emit 或 ilasm),运行时不会有任何问题。
    【解决方案2】:

    C# 规范说明了可以使用哪些字符。

    然而,CLR 允许更多。这就是 C# 编译器发出它们的原因。

    【讨论】:

    • 我希望 CLR 中允许的内容在 CLR 规范中定义。
    • @Richard:CLR 在引用时几乎允许任何内容。例如:'!2ss&lt;,' 在 IL 中有效。
    • 非常有趣!这种行为是否也可以追溯到旧版本的 CLR?
    • @Darkzaelus:据我所知,是的,一直回到 1.0。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-16
    • 2010-10-19
    • 2011-04-01
    • 2011-01-27
    • 2013-08-02
    相关资源
    最近更新 更多