質問

名前には他の制限がありますか(スコープ内の明白な一意性以外)?

これらはどこで定義されていますか

役に立ちましたか?

解決

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 。理由がわからない。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top