1

変数名がユーザーによって指定されるコードジェネレーターを作成しています。

以前の回答では、正規表現またはCodeDomProviderの使用が提案されていました。前者は識別子が有効かどうかを示しますが、キーワードはチェックしません。後者はキーワードをチェックしますが、コードで認識されているすべてのタイプをチェックするようには見えません。 文字列が有効な変数名であるかどうかを判断するにはどうすればよいですか?

たとえば、ユーザーは変数List、またはTypeに名前を付けることができますが、それは望ましくありません。どうすればこれを防ぐことができますか?

4

4 に答える 4

3

最も簡単な方法は、C#キーワードのリストをアプリケーションに追加することです。MSDNには完全なリストがあります

本当に凝ったものにしたい場合は、生成されたコードを動的にコンパイルして、懸念している特定のエラーをチェックすることができます。この場合、特にエラーCS1041を探しています。

エラーCS1041:識別子が必要です。' ** 'はキーワードです

未解決の参照、宣言されていない識別子などに関するエラーは無視することをお勧めします。

他の人が示唆しているように、識別子の前に、を付けることができます@。これは、生成されたコードをユーザーに調べさせたくない場合は問題ありません。しかし、それが彼らが維持しなければならないものである場合、私はそれを避けます(私の意見では)$PHPのいたるところやthis.、すべての気紛れな人の前に置くことを主張する人のように、コードが騒々しくなりますフィールドリファレンス。

于 2011-02-02T17:40:13.363 に答える
2

探しているものを提供する完全なAPIが利用できるかどうかはわかりません。ただし、探していると思われる最終結果は、予約済みのC#キーワードまたは既存のタイプとの競合を引き起こさないコードの生成です。その場合、あなたが取ることができる1つのアプローチは、@シンボルでユーザーによって与えられたすべての識別子をエスケープすることです。これにより、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

ここでの1つのオプションは、コードジェネレーターにユーザー指定の名前のプレフィックスを付けること@です。2.4.2で説明されているように、記号@(逐語的な識別子):

プレフィックス「@」を使用すると、キーワードを識別子として使用できます。これは、他のプログラミング言語とのインターフェースに役立ちます。文字@は実際には識別子の一部ではないため、他の言語では、接頭辞なしの通常の識別子として識別子が表示される場合があります。@プレフィックスが付いた識別子は、逐語的識別子と呼ばれます。キーワードではない識別子に@プレフィックスを使用することは許可されていますが、スタイルの問題として強くお勧めしません。

これにより、メインキーワードを確認し、必要に応じてそれらを拒否できますが、競合するすべてのタイプ情報などについて心配する必要はありません。

于 2011-02-02T17:40:44.880 に答える
1

変数の先頭に文字を追加することもできます。@たとえば、@privateは有効な変数名です。

于 2011-02-02T17:39:48.540 に答える