C#/ CLI識別子の最大長は?
-
06-07-2019 - |
質問
名前には他の制限がありますか(スコープ内の明白な一意性以外)?
これらはどこで定義されていますか
解決
ECMA-335のPDF 、パーティションIIから、セクション22、" Metadataは、コンパイラまたはコードジェネレーターによって作成された名前の文字列を変更せずに保持します。本質的に、それは扱います 不透明なblobとしての各文字列。特に、大文字と小文字を区別します。 CLIは、メタデータに保存され、その後CLIによって処理される名前の長さに制限を設けません"。
これを正しく読み、コンテキストが正しい場合、CLRの識別子の長さに実際の制限はありません。
他のヒント
他の回答に加えて、Microsoft Visual C#コンパイラで受け入れられる識別子の最大長は 511文字です。これは、次のコードでテストできます。
class Program
{
private static void Main(string[] args)
{
int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa = 5;
}
}
変数名の長さは511文字です。このコードはコンパイルされますが、名前に1文字が追加されると、コンパイラは error CS0645:Identifier too long
を出力します。
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 Table] NameエントリとNamespaceエントリによって参照される文字列の合計長は、1,023バイトを超えてはなりません。
ページ144:
[TypeRef Table] [run time] NameエントリとNamespaceエントリによって参照される文字列の合計長は、1,023バイトを超えてはなりません。
ページ186:
[Method Table] Name(#Stringsストリームのオフセット)。メソッドの名前(メソッドが属するクラスの名前は含まれません)。このエントリは、UTF-8エンコーディングで1,023バイト以下の長さ0以外の文字列にインデックスを付ける必要があります。
Partition IIメタデータドキュメントを見ると、識別子はIDまたはSQSTRINGのいずれかであることが示されています
IDは次のように記述されます
連続した文字列 アルファベットで始まる 文字または“ _”、“ $”、“ @”のいずれかまたは “?”そしてその後に任意の数の 英数字または“ _”のいずれか、 “ $”、“ @&#8221 ;、または“?”
長さの制限がないことを意味します。
Visual Studio 2015(アップデート3)-C#6
クラス名の最大長= 993 文字
public class AaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaAAAAAZZZ
{
}
さらに1文字追加すると、コンパイルされず、驚くべきことにエラーリストも空になります!
編集:VS2013 Update 3を使用している同僚の場合、クラス名の制限= 1012 。理由がわからない。