1

我正在编写一个代码生成器,其中变量名称由用户给出。

以前的答案建议使用 Regex 或 CodeDomProvider,前者会告诉您标识符是否有效,但不检查关键字,后者检查关键字,但似乎不会检查代码已知的所有类型。 如何确定字符串是否是有效的变量名?

例如,用户可以命名一个变量ListType,但这是不可取的。我将如何防止这种情况?

4

4 回答 4

3

最简单的方法是将 C# 关键字列表添加到您的应用程序中。MSDN 在这里有一个完整的列表。

如果您真的想变得花哨,您可以动态编译生成的代码并检查您关心的特定错误。在这种情况下,您正在专门寻找错误CS1041

错误 CS1041:需要标识符;' * *' 是关键字

您可能希望忽略有关未解决的引用、未声明的标识符等的任何错误。

正如其他人所建议的那样,您可以在标识符前面加上@,如果您不希望用户检查生成的代码,这很好。但是,如果这是他们必须维护的东西,我会避免这种情况,因为(在我看来)它会使代码变得嘈杂,就像$PHP 中到处都是,或者那些坚持放在this.每一个怪胎面前的人一样字段参考。

于 2011-02-02T17:40:13.363 回答
2

我不确定是否有完整的 API 可以为您提供所需的内容。但是,您似乎正在寻找的最终结果是生成不会与保留的 C# 关键字或现有类型发生冲突的代码。如果是这种情况,您可以采取的一种方法是使用@符号转义用户给出的所有标识符。这甚至允许将 C# 中的保留关键字视为标识符。

例如以下是完全有效的 C# 程序

class Program
{
    static void Main(string[] args)
    {
        int @byte = 42;
        int @string = @byte;
        int @Program = 0;
    }
}
于 2011-02-02T17:40:11.370 回答
2

这里的一种选择是让您的代码生成器在用户指定的名称前面加上@. 如2.4.2中所述,@符号(逐字标识符):

前缀“@”允许使用关键字作为标识符,这在与其他编程语言交互时很有用。字符 @ 实际上不是标识符的一部分,因此标识符在其他语言中可能被视为普通标识符,没有前缀。带有@ 前缀的标识符称为逐字标识符。允许对不是关键字的标识符使用 @ 前缀,但出于风格问题强烈建议不要使用。

这将允许您检查主要关键字,并根据需要拒绝它们,但不必担心所有冲突的类型信息等。

于 2011-02-02T17:40:44.880 回答
1

您可以@在变量前添加一个字符 - 例如,@private是一个有效的变量名。

于 2011-02-02T17:39:48.540 回答