El Microsoft.CSharp.CSharpCodeGenerator
tiene un método IsKeyword(string)
que hace exactamente eso. Sin embargo, la clase es interna, por lo que debe usar el reflejo para acceder a ella y no hay garantía de que esté disponible en futuras versiones de .NET Framework. Tenga en cuenta que IsKeyword
no se ocupa de las diferentes versiones de C#.
El método público System.CodeDom.Compiler.ICodeGenerator.IsValidIdentifier(string)
rechaza las palabras clave también. El inconveniente es que este método también realiza otras validaciones, por lo que también se rechazan otras cadenas que no sean palabras clave.
Actualización: Si sólo necesita para producir un identificador válido en lugar de decidir si una cadena particular es una palabra clave, puede utilizar ICodeGenerator.CreateValidIdentifier(string)
. Este método se encarga de las cadenas con dos guiones bajos principales también, añadiéndoles un guión bajo más. Lo mismo vale para las palabras clave. Tenga en cuenta que ICodeGenerator.CreateEscapedIdentifier(string)
prefija tales cadenas con el signo @
.
Los identificadores que se inician con dos guiones bajos principales están reservados para la implementación (es decir, el compilador de C# y los generadores de códigos asociados, etc.), por lo que evitarlos es una buena idea.
Actualización 2: La razón para preferir ICodeGenerator.CreateValidIdentifier
sobre ICodeGenerator.CreateEscapedIdentifier
es que __x
y @__x
son esencialmente el mismo identificador. Lo siguiente no se compilará:
int __x = 10;
int @__x = 20;
En caso de que el compilador generar y utilizar un identificador __x
, y el usuario utilizaría @__x
como resultado de una llamada a CreateEscapedIdentifier
, se produciría un error de compilación. Al usar CreateValidIdentifier
, esta situación se previene porque el identificador personalizado se convierte en ___x
(tres guiones bajos).
La duda de eso. Una de las razones podría ser: hay palabras clave específicas del contexto. –
... aunque si no te importa el contexto, si una cadena es una palabra clave es una prueba bastante simple. Dudo que el esfuerzo por mantener esa prueba sea algo más que trivial. Incluso MS no puede fabricar versiones de C# muy rápido. –