名前には他にどのような制限がありますか (スコープ内での明らかな一意性以外に)?
それらはどこで定義されていますか?
名前には他にどのような制限がありますか (スコープ内での明らかな一意性以外に)?
それらはどこで定義されていますか?
他の回答に加えて、Microsoft Visual C# コンパイラで受け入れられる識別子の最大長は511 文字です。これは、次のコードでテストできます。
class Program
{
private static void Main(string[] args)
{
int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa = 5;
}
}
変数名の長さは 511 文字です。このコードはコンパイルされますが、名前に 1 文字追加すると、コンパイラはerror CS0645: Identifier too long
.
ECMA-335、パーティション II、セクション 22の PDF から:
メタデータは、コンパイラまたはコード ジェネレーターによって作成された名前文字列を変更せずに保持します。基本的に、各文字列を不透明なブロブとして扱います。特に、大文字小文字を保持します。CLI は、メタデータに保存され、その後 CLI によって処理される名前の長さに制限を課しません。
これを正しく読み、コンテキストが正しい場合、CLR の識別子の長さに実際の制限はありません。
C# 言語仕様では、Unified C# 3.0 仕様のセクション 2.4.2 で識別子が定義されています。基本的には、「文字またはアンダースコア」の後に任意の数の「文字、10 進数、接続文字、結合文字、書式設定文字」が続きます。キーワードを識別子として使用するには、@ を前に付ける必要があります。int @int = 5;
私は CLI 仕様を調べていませんが、C# コンパイラは匿名メソッドのようなものに「言いようのない」名前を使用するため、C# 仕様よりもわずかに制限が少ないことを知っています。これらには通常、CLI で有効な山括弧が含まれますがC# では無効です。
編集: C# 仕様には明示的な名前の長さの制限はありませんが、セクション 2.4.2 には 1 つの予約があります。
2 つの連続したアンダースコア文字 (U+005F) を含む識別子は、実装で使用するために予約されています。たとえば、実装によって、2 つのアンダースコアで始まる拡張キーワードが提供される場合があります。
つまり、で始まる特定の識別子が機能するかどうかは実装固有__
です。(一部のコンパイラは__foo
拡張キーワードを持っている場合と、持っていない場合があります。)
「Expert .NET 2.0 IL Assembler」(Serge Lidin、Apress) のさまざまな箇所によると、機能的な CIL/CLR 制限は、UTF-8 でエンコードされた 1,023 バイトです。引用:
122ページ:
ILAsm のどちらの種類の名前の長さも構文的に制限されていませんが、メタデータ ルールによって名前の長さに一定の制限が課されます。
126ページ:
共通言語ランタイムは、完全なクラス名の長さに制限を課し、UTF-8 エンコーディングで 1,023 バイトを超えないように指定します。ただし、ILAsm コンパイラはこの制限を適用しません。ILAsm で単純な名前に使用される単一引用符は、純粋に語彙的なツールであり、メタデータには含まれません。したがって、完全なクラス名の全長には影響しません。
143ページ:
[TypeDef テーブル] Name および Namespace エントリによって参照される文字列の長さの合計は、1,023 バイトを超えてはなりません。
144ページ:
[TypeRef テーブル] [実行時] Name および Namespace エントリによって参照される文字列の長さの合計は、1,023 バイトを超えてはなりません。
186ページ:
[メソッド テーブル] 名前 (#Strings ストリーム内のオフセット)。メソッドの名前 (メソッドが属するクラスの名前は含みません)。このエントリは、UTF-8 エンコーディングで 1,023 バイト以下の長さのゼロ以外の文字列にインデックスを付ける必要があります。
Partition II Metadata docs を見ると、識別子はIDまたはSQSTRINGのいずれかであると記載されています
ID は次のように記述されます。
英字、または「_」、「$」、「@」、「?」のいずれかで始まる連続した文字列 任意の数の英数字または「_」、「$」、「@」、「?」のいずれかが続きます</p>
これは、長さの制限がないことを意味します。