OpCodes.Readonly フィールド
アセンブリ: mscorlib (mscorlib.dll 内)


命令の 16 進数の形式、MSIL (Microsoft Intermediate Language) アセンブリ形式、および簡単な説明の一覧を次の表に示します。
このプリフィックスは、ldelema 命令の直前にだけ置くことができ、配列に対して特殊な Address メソッドを呼び出します。以降の演算に対して、次の 2 つの影響があります。
-
実行時に、型チェックの演算は実行されません。参照型の配列で使用すると、通常、ldelema 命令と stelem 命令の暗黙の型チェックが実行されます。値クラスの実行時の型チェックが行われることはないため、この場合 readonly は操作できません。
定義する型によって値を変更できるかどうかが制御されるため、ポインタは変更可能性が制限されていると言われます。値を適切に更新する非パブリック フィールドまたは非パブリック メソッドを公開しない値クラスの場合、ポインタは読み取り専用です。したがって、ポインタはプリフィックスの名前になります。特に、プリミティブ型を表すクラス (System.Int32 など) は、ミューテータを公開しないため、読み取り専用になります。
この方法で制限されたマネージ ポインタは、次の方法でのみ使用できます。
-
ldfld、ldflda、stfld、call、または constrained callvirt の各命令の object パラメータとして使用する。
-
ldobj 命令に対する pointer パラメータ、または ldind 命令のいずれかに対する pointer パラメータとして使用する。
stobj、initobj、mkrefany の各演算またはすべての stind 命令を含め、他のすべての演算は許可されていません。
readonly プリフィックスの目的は、ジェネリック コードで配列から要素をフェッチする際の型チェックを回避することです。たとえば、arr 配列の要素型が m メソッドとのインターフェイスを持つように制約されたジェネリック型である式 arr[i].m() は、次の MSIL にコンパイルできます。
ldloc arr ldloc i readonly. ldelema !0 // Loads the pointer to the object. … // Load the arguments to the call. constrained. !0 callvirt m
readonly プリフィックスがないと、!0 が参照型の場合に ldelema 命令は型チェックを実行します。この型チェックは非効率的であるだけでなく、形式的に不正確でもあります。ldelema の型チェックは厳密な一致を求めるため、強力すぎます。配列が !0 型のサブクラスを保持している場合、上記のコードでは型チェックが失敗します。
値型と参照型の両方に対して機能する arr[i] のハンドルを持つために、要素自体ではなく、配列要素のアドレスがフェッチされます。そして、配列要素のアドレスを constrained callvirt 命令に渡すことができます。
通常、配列が参照型の要素を保持している場合、実行時のチェックをスキップすることは危険です。安全性を確保するには、このポインタを通じて配列への変更が行われないことを保証する必要があります。検証規則によってこれを保証します。制限されたマネージ ポインタは、インスタンス メソッド呼び出しのオブジェクトとして渡すことができるため、厳密に言うと値型に対して読み取り専用ではありませんが、値型に関するタイプ セーフの問題は発生しません。
readonly オペコードを使用できる Emit メソッド オーバーロードを次に示します。
-
ILGenerator.Emit(OpCode)

Windows 98, Windows 2000 SP4, Windows Millennium Edition, Windows Server 2003, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP SP2, Windows XP Starter Edition
開発プラットフォームの中には、.NET Framework によってサポートされていないバージョンがあります。サポートされているバージョンについては、「システム要件」を参照してください。


Weblioに収録されているすべての辞書からOpCodes.Readonly フィールドを検索する場合は、下記のリンクをクリックしてください。

- OpCodes.Readonly フィールドのページへのリンク