2011-07-19 30 views
2

.Net識別子でどのような文字が使用されているのでしょうか?.Net/CLR識別子

C#またはVB.Netではなく、CLRです。私はこれを聞いて

理由は、私は(C# In Depthyield return文が実行されたかを見て、それは次のようなコードにコンパイルすることを見たされています

public int <count>5__1; 

私が使用できる任意の他の識別子の文字がありますか?このコードは公開されません。

答えて

1

C#仕様には、どの文字を使用できるかが記載されています。

ただし、CLRではこれ以上のことが可能です。そのため、C#コンパイラはそれらをそのまま出力します。

+0

CLRで許可されているものがCLR仕様で定義されていると思います。 – Richard

+0

@リチャード:CLRは引用されるとほとんど何でも許します。例: ''!2ss <、 ''はILで有効です。 – leppie

+0

非常に興味深い!この動作は古いバージョンのCLRにも戻りますか? – Darkzaelus

2

これは、8.5.1章「有効な名前」、CLS仕様によって支配されている:

CLSは4ルール:アセンブリは、Unicode標準3.0のセットを支配 のテクニカルレポート15の附属書7に従います に許可された文字を識別子に含めることができます。オンラインで利用できるのは http://www.unicode.org/unicode/reports/tr15/tr15-18.htmlです。 は、Unicode正規化形式 で定義されている標準形式でなければなりません。CLS目的の場合、小文字の マッピング(Unicodeロケールに依存しない1対1の の小文字マッピング)同じ。すなわち、2つの識別子が であるとCLSの下で異なるとみなされる場合、それらは単に 以上に異なるものとする。ただし、継承された 定義を上書きするには、CLIで元の 宣言の正確なエンコーディングを使用する必要があります。

換言すれば、それは禁止事項文字のリストを指定していない、それは驚きなしで文字列を比較することができることについての唯一の懸念です。 CLRが今までにしなければならないことはすべてです。コンパイラの仕事ははるかに難しく、プログラム内のトークン、つまりレクサーの仕事を認識できなければなりません。実用的なレクサーの実装では、識別子内の有効な文字に関するルールを設定します。例えば、数字で識別子を始めることではありません。

+0

丁寧な回答ですが、これはCLRの要件ではなくCLSの要件を指定していることに注意してください。 – kvb

+0

私が知っているCLRの実装は、CLSの規則に従います。 –

+0

私はそれがかなり正しいとは思わない。 CLSの規則は、他の言語との相互運用が望まれる場合にコンパイラが対象とするCLRの動作の制限されたサブセットを示しています(仕様の第I章のセクション7を参照)。ただし、CLRは非CLS準拠型を明確にサポートしていますが、アセンブリ仕様外では表示されない型はCLS規則に従う必要がないことが仕様で具体的に説明されています。 – kvb