Как проверить, что строка не является ключевым словом или введите C # - PullRequest
1 голос
/ 02 февраля 2011

Я пишу генератор кода, в котором имена переменных задаются пользователем.

В предыдущих ответах предлагалось использовать Regex или CodeDomProvider, первый сообщит вам, действителен ли идентификатор, но не проверяет ключевые слова, последний проверяет ключевые слова, но не проверяет все типы, известные коду. Как определить, является ли строка допустимым именем переменной?

Например, пользователь может назвать переменную List или Type, но это нежелательно. Как бы мне предотвратить это?

Ответы [ 4 ]

3 голосов
/ 02 февраля 2011

Самый простой способ - добавить список ключевых слов C # в ваше приложение.У MSDN есть полный список здесь .

Если вы действительно хотите стать модным, вы можете динамически скомпилировать сгенерированный код и проверить, какие именно ошибки вы обнаружите.обеспокоен.В этом случае вы специально ищете ошибку CS1041 :

ошибка CS1041: ожидается идентификатор;'**' - это ключевое слово

Возможно, вы захотите игнорировать любые ошибки, касающиеся неразрешенных ссылок, необъявленных идентификаторов и т. Д.

Как и предлагали другиеВы можете просто добавить свои идентификаторы к @, что хорошо, если вы не хотите, чтобы пользователь проверял сгенерированный код.Если это то, что им придется поддерживать, однако, я бы избегал этого, так как (по моему мнению) это делает код шумящим, точно так же как $ повсюду в PHP или парнями, которые настаивают на установке this. перед каждой ссылкой на долбанное поле.

2 голосов
/ 02 февраля 2011

Одним из вариантов здесь будет иметь префикс вашего кода генератора к указанному пользователем имени с @. Как указано в п. 2.4.2 , знак @ (дословный идентификатор):

Префикс "@" позволяет использовать ключевые слова в качестве идентификаторов, что полезно при взаимодействии с другими языками программирования. Символ @ на самом деле не является частью идентификатора, поэтому идентификатор может рассматриваться на других языках как обычный идентификатор без префикса. Идентификатор с префиксом @ называется дословным идентификатором. Использование префикса @ для идентификаторов, которые не являются ключевыми словами, разрешено, но настоятельно не рекомендуется из-за стиля.

Это позволит вам проверять основные ключевые слова и при необходимости отклонять их, но не беспокоиться обо всей информации о конфликтующих типах и т. Д.

2 голосов
/ 02 февраля 2011

Я не уверен, что доступен полный API, который даст вам то, что вы ищете. Однако конечный результат, который вы, похоже, ищете, - это генерация кода, который не вызовет конфликтов с зарезервированными ключевыми словами C # или существующими типами. Если это один из подходов, который вы можете использовать, это экранировать все идентификаторы, заданные пользователем с символом @. Это позволяет обрабатывать даже зарезервированные ключевые слова в C # как идентификаторы.

Например, приведенная ниже полностью действительная программа на C #

class Program
{
    static void Main(string[] args)
    {
        int @byte = 42;
        int @string = @byte;
        int @Program = 0;
    }
}
1 голос
/ 02 февраля 2011

Вы можете просто добавить символ @ к переменной - например, @private является допустимым именем переменной.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...