次の方法で共有


OpCodes.TakesSingleByteArgument メソッド

提供されたオペコードが 1 バイト引数をとる場合は、true または false を返します。

Public Shared Function TakesSingleByteArgument( _
   ByVal inst As OpCode _) As Boolean
[C#]
public static bool TakesSingleByteArgument(OpCodeinst);
[C++]
public: static bool TakesSingleByteArgument(OpCodeinst);
[JScript]
public static function TakesSingleByteArgument(
   inst : OpCode) : Boolean;

パラメータ

  • inst
    Opcode オブジェクトのインスタンス。

戻り値

True または false

解説

このメソッドは、どの MSIL オペコードが最適化されたコードで使用する "短い形式" かを見つけるときに使用できます。

OpCode のインスタンスが以下の場合に 1 バイトの引数をとる場合、 TakesSingleByteArgumenttrue を返します。

  • オペコードがバイト サイズのアドレスへの分岐命令を実行する (たとえば、 Br_S および Bgt_S)。
  • オペコードがスタックにバイト値をプッシュする (たとえば、 Ldc_I4_S)。
  • オペコードがバイト サイズの "短い形式" を通じて変数または引数を参照する (たとえば、 Ldloc_S および Stloc_S)。

それ以外の場合は、 false を返します。

TakesSingleByteArgument を使用し、 OpCodes クラスにリフレクションして、1 バイト引数をとるかどうかを各 OpCode フィールドでテストする例を次に示します。

 

   Public Shared Sub Main()

      ' We need a blank OpCode object for reference when calling FieldInfo.GetValue().

      Dim blankOpCode As New OpCode()
      
      Dim myOpCodesType As Type = Type.GetType("System.Reflection.Emit.OpCodes")
      Dim listOfOpCodes As FieldInfo() = myOpCodesType.GetFields()
      
      Console.WriteLine("Which OpCodes take single-byte arguments?")
      Console.WriteLine("-----------------------------------------")
      
      ' Now, let's reflect on each FieldInfo and create an instance of the OpCode it represents.
      Dim opCodeFI As FieldInfo
      For Each opCodeFI In  listOfOpCodes
         Dim theOpCode As Object = opCodeFI.GetValue(blankOpCode)
         
         Console.WriteLine("{0}: {1}", opCodeFI.Name, _
               OpCodes.TakesSingleByteArgument(CType(theOpCode, OpCode)).ToString())
      Next opCodeFI

   End Sub 'Main


[C#] 

public static void Main()
{
   // We need a blank OpCode object for reference when calling FieldInfo.GetValue().

   OpCode blankOpCode = new OpCode(); 

   Type myOpCodesType = Type.GetType("System.Reflection.Emit.OpCodes");
   FieldInfo[] listOfOpCodes = myOpCodesType.GetFields();

   Console.WriteLine("Which OpCodes take single-byte arguments?");
   Console.WriteLine("-----------------------------------------");

   // Now, let's reflect on each FieldInfo and create an instance of the OpCode it represents.

   foreach (FieldInfo opCodeFI in listOfOpCodes)
   {
    object theOpCode = opCodeFI.GetValue(blankOpCode);
    
    Console.WriteLine("{0}: {1}", opCodeFI.Name, 
              OpCodes.TakesSingleByteArgument((OpCode)theOpCode).ToString());
   }

}


[C++] 
int main() {
   // We need a blank OpCode Object for reference when calling FieldInfo::GetValue().
   OpCode blankOpCode;

   Type*  myOpCodesType = Type::GetType(S"System.Reflection.Emit.OpCodes");
   FieldInfo*  listOfOpCodes[] = myOpCodesType->GetFields();

   Console::WriteLine(S"Which OpCodes take single-Byte arguments?");
   Console::WriteLine(S"-----------------------------------------");

   // Now, let's reflect on each FieldInfo and create an instance of the OpCode it represents.

   System::Collections::IEnumerator* myEnum = listOfOpCodes->GetEnumerator();
   while (myEnum->MoveNext()) {
      FieldInfo* opCodeFI = __try_cast<FieldInfo*>(myEnum->Current);

      Object* theOpCode = opCodeFI->GetValue(__box(blankOpCode));

      Console::WriteLine(S" {0}: {1}", opCodeFI->Name,
         __box(OpCodes::TakesSingleByteArgument(*dynamic_cast<OpCode*>(theOpCode))));
   }
}

必要条件

プラットフォーム: Windows 98, Windows NT 4.0, Windows Millennium Edition, Windows 2000, Windows XP Home Edition, Windows XP Professional, Windows Server 2003 ファミリ

参照

OpCodes クラス | OpCodes メンバ | System.Reflection.Emit 名前空間