C# 如何检查字符串不是c中的关键字或类型

C# 如何检查字符串不是c中的关键字或类型,c#,types,keyword,identifier,C#,Types,Keyword,Identifier,我正在编写一个代码生成器,其中变量名由用户给定 前面的答案建议使用Regex或CodeDomProvider,前者会告诉您标识符是否有效,但不会检查关键字,后者会检查关键字,但似乎不会检查代码已知的所有类型。 例如,用户可以命名变量列表或类型,但这是不可取的。如何防止这种情况发生?您可以在变量前面加一个@字符-例如,@private是一个有效的变量名。您可以在变量前面加一个@字符-例如,@private是一个有效的变量名。我不确定是否有一个完整的API可以提供您所需的内容。然而,您似乎要寻找的

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

前面的答案建议使用Regex或CodeDomProvider,前者会告诉您标识符是否有效,但不会检查关键字,后者会检查关键字,但似乎不会检查代码已知的所有类型。


例如,用户可以命名变量列表或类型,但这是不可取的。如何防止这种情况发生?

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

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

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

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

class Program
{
    static void Main(string[] args)
    {
        int @byte = 42;
        int @string = @byte;
        int @Program = 0;
    }
}

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

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

class Program
{
    static void Main(string[] args)
    {
        int @byte = 42;
        int @string = @byte;
        int @Program = 0;
    }
}

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

如果你真的想变得有趣,你可以检查你所关心的具体错误。在本例中,您专门查找错误:

错误CS1041:应为标识符;'**'这是一个关键词

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


正如其他人所建议的,您可以在标识符前面加上@,如果您不想让用户检查生成的代码,就可以这样做。但是,如果这是他们必须维护的东西,我会避免这样做,因为在我看来,这会让代码变得嘈杂,就像PHP中到处都是美元或者坚持使用这个的人一样。最简单的方法是在应用程序中添加一个C关键字列表。MSDN有一个完整的列表

如果你真的想变得有趣,你可以检查你所关心的具体错误。在本例中,您专门查找错误:

错误CS1041:应为标识符;'**'这是一个关键词

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


正如其他人所建议的,您可以在标识符前面加上@,如果您不想让用户检查生成的代码,就可以这样做。但是,如果这是他们必须维护的东西,我会避免这样做,因为在我看来,这会让代码变得嘈杂,就像PHP中到处都是美元或者坚持使用这个的人一样。在每个奇怪的字段引用前面。

这里的一个选项是让代码生成器在用户指定的名称前面加上@。例如,@sign逐字记录标识符:

前缀@允许使用关键字作为标识符,这在与其他编程语言交互时非常有用。字符@实际上不是标识符的一部分,因此该标识符在其他语言中可能被视为普通标识符,没有前缀。带有@前缀的标识符称为逐字标识符。允许对非关键字的标识符使用@前缀,但强烈反对使用@前缀作为样式


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

这里的一个选项是让代码生成器在用户指定的名称前面加上@。例如,@sign逐字记录标识符:

前缀@允许使用关键字作为标识符,这在与其他编程语言交互时非常有用。字符@实际上不是标识符的一部分,因此该标识符在其他语言中可能被视为普通标识符,没有前缀。带有@前缀的标识符称为逐字标识符。允许对非关键字的标识符使用@前缀,但强烈反对使用@前缀作为样式


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

请原谅我的无知,但您不能尝试编译代码,并返回运行时抛出的任何错误吗
它将随着您在代码中使用的名称空间的不同而变化很大。此外,随着时间的推移,这些名称空间将添加新类型。您可以使用反射来查找程序集中的所有类。@asawyer:这可能是一个很好的解决方案。@clintp保留字列表实际上没有变化,动态编译将返回一个错误列表,他可以从中筛选出他真正关心的“标识符期望,“***”是一个关键字。解决方案似乎是1 add@symbol或2 compile或3列出所有关键字。3虽然没有做我想做的,因为CodeDomProvider已经这样做了,我相信。请原谅我的无知,但是您不能尝试编译代码,并返回运行时抛出的任何错误吗?这将随着您在代码中使用的名称空间而发生很大变化。此外,随着时间的推移,这些名称空间将添加新类型。您可以使用反射来查找程序集中的所有类。@asawyer:这可能是一个很好的解决方案。@clintp保留字列表实际上没有变化,动态编译将返回一个错误列表,他可以从中筛选出他真正关心的“标识符期望,“***”是一个关键字。解决方案似乎是1 add@symbol或2 compile或3列出所有关键字。3虽然没有做我想做的,因为CodeDomProvider已经这样做了,我相信。希望下一版本的C不会添加与代码生成的内容冲突的新关键字。希望下一版本的C不会添加与代码生成的内容冲突的新关键字。