2011-02-02 7 views
1

私は変数名がユーザによって与えられたコードジェネレータを書いています。文字列がキーワードまたはタイプでないことをcで確認する方法#

以前の回答では、識別子が有効であるがキーワードをチェックしない場合は後者がキーワードをチェックしますが、コードに認識されているすべてのタイプをチェックするようには見えません。例えば How to determine if a string is a valid variable name?

、ユーザは変数List、又はTypeに名前を付けることができ、それは望ましくありません。どのように私はこれを防ぐだろうか?

+0

など、あなたが主なキーワードをチェックし、必要に応じてそれらを否定するが、競合型情報のすべてを心配しないようにできますが、あなただけのコンパイルしようcouldntのでしょう実行時に何かエラーが発生した場合はコードを返します。 – asawyer

+1

これは、 'using'を使ってコードに取り込んだ名前空間によって大きく変わることでしょう。さらに、これらの名前空間は新しいタイプを追加します。リフレクションを使用して、アセンブリ内のすべてのクラスを見つけることができます。 –

+0

@asawyer:それは良い解決策かもしれません。 – user420667

答えて

2

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

たとえば以下は、最も簡単な方法は、アプリケーションにC#のキーワードのリストを追加することで、完全に有効なC#プログラム

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

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

3

です。 MSDNには完全なリストhereがあります。

あなたが本当に好奇心を得たい場合はdynamically compile your generated codeとなり、あなたが心配している特定のエラーを確認することができます。この場合、具体的にはエラーCS1041を探しています。

エラーCS1041:識別子が必要です。 「*は*」あなたはおそらく等の未解決の参照、宣言されていない識別子、に関するすべてのエラーを無視したいと思うキーワード

ある

他の人が示唆したように、あなただけの@であなたの識別子を付加できこれは、ユーザーが生成されたコードを調べることを望まない場合は問題ありません。しかし、メンテナンスする必要がある場合は、私の意見では、コードのノイズが多いように、コードのほうが騒々しいのを避けたいと考えています。$のように、PHPまたは人の前にthis.すべての恐ろしいフィールドリファレンス。

+0

そして、次のバージョンのC#では、コードが生成するものと競合する新しいキーワードを追加しないことを願っています。 –

2

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

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

これは私の無知を許し

関連する問題