Delegate クラスとは? わかりやすく解説

Delegate クラス

静的メソッドまたはクラス インスタンスとそのクラスインスタンス メソッド参照するデータ構造体であるデリゲート表します

名前空間: System
アセンブリ: mscorlib (mscorlib.dll 内)
構文構文

<SerializableAttribute> _
<ClassInterfaceAttribute(ClassInterfaceType.AutoDual)> _
<ComVisibleAttribute(True)> _
Public MustInherit Class
 Delegate
    Implements ICloneable, ISerializable
[SerializableAttribute] 
[ClassInterfaceAttribute(ClassInterfaceType.AutoDual)] 
[ComVisibleAttribute(true)] 
public abstract class Delegate : ICloneable,
 ISerializable
[SerializableAttribute] 
[ClassInterfaceAttribute(ClassInterfaceType::AutoDual)] 
[ComVisibleAttribute(true)] 
public ref class Delegate abstract : ICloneable,
 ISerializable
/** @attribute SerializableAttribute() */ 
/** @attribute ClassInterfaceAttribute(ClassInterfaceType.AutoDual) */ 
/** @attribute ComVisibleAttribute(true) */ 
public abstract class Delegate implements ICloneable,
 ISerializable
SerializableAttribute 
ClassInterfaceAttribute(ClassInterfaceType.AutoDual) 
ComVisibleAttribute(true) 
public abstract class Delegate implements ICloneable,
 ISerializable
解説解説

Delegate クラスは、デリゲート型基本クラスです。ただし、システムコンパイラ限りDelegate クラスまたは MulticastDelegate クラスから明示的に派生させることができますデリゲート型から新しい型を派生させることはできません。Delegate クラスは、デリゲート型とは見なされません。このクラスは、デリゲート型派生させるために使用されるクラスです。

ほとんどの言語では delegate キーワードが実装されています。また、それらの言語コンパイラMulticastDelegate クラスから派生させることができますこのため開発者各言語提供されている delegate キーワードを使用する必要があります

デリゲート型宣言によって、1 つ上のメソッドシグネチャ指定するコントラクト確立します。デリゲートは、次の参照先を持つデリゲート型インスタンスです。

デリゲート バインディング詳細については、「共通型システムデリゲート」と「CreateDelegate(Type,Object,MethodInfo,Boolean)」を参照してください

メモメモ

.NET Framework Version 1.0 および Version 1.1 では、メソッドシグネチャデリゲート型指定されシグネチャ完全に一致する場合にのみ、デリゲートメソッドを表すことができます。つまり、上述最初の項目と 3 番目の項目のみがサポートされ最初の項目では完全な型の一致が必要です。

デリゲート最初引数に対して閉じられインスタンス メソッド表している場合 (最も一般的)、デリゲートは、メソッドエントリ ポイントへの参照と、そのメソッド定義した型に適用可能な型である、ターゲット呼ばれるオブジェクトへの参照格納しますデリゲートオープンインスタンス メソッド表している場合デリゲートはそのメソッドエントリ ポイントへの参照格納してます。デリゲート シグネチャは、仮パラメータ リストに非表示this パラメータ含める必要があります。この場合デリゲートターゲット オブジェクトへの参照持ちません。デリゲート呼び出すときに、ターゲット オブジェクト指定する必要があります

デリゲート静的メソッド表している場合デリゲートはそのメソッドエントリ ポイントへの参照格納してます。デリゲート最初引数に対して閉じている静的メソッド表している場合デリゲートメソッドエントリ ポイントへの参照と、そのメソッド最初引数の型に適用できるターゲット オブジェクトへの参照格納してます。デリゲート呼び出したときに、最初静的メソッド引数ターゲット オブジェクト受け取ります

デリゲート呼び出しリストは、順序付けられたデリゲートセットであり、呼び出しリスト内の各要素デリゲートによって呼び出されるメソッド1 つずつ表します呼び出しリストには、重複メソッド格納できますデリゲートメソッド呼び出すときは、呼び出しリスト出現する順にメソッド呼び出します。デリゲート呼び出しリスト内のすべてのメソッド呼び出そうとします重複メソッドは、呼び出しリスト出現するたびに呼び出されます。デリゲート不変であるため、デリゲート呼び出しリスト一度作成すると、そのリスト変わりません。

複数メソッド呼び出したり、組み合わせ演算使用できるデリゲートを、それぞれ "マルチキャスト デリゲート" および "組み合わせ可能デリゲート" と呼びます

CombineRemove などの組み合わせ演算によって既存デリゲート変更されることはありません。その代わり組み合わせ演算では、演算結果、または変更されないデリゲート、または null 参照 (Visual Basic では Nothing) が格納され新しデリゲート返されます。演算結果メソッドをまったく参照していないデリゲート場合は、null 参照 (Visual Basic では Nothing) が返されます。要求した演算無効場合は、変更されないデリゲート返されます。

呼び出されメソッド例外スローした場合は、メソッド実行中止しデリゲート呼び出し元に例外戻され呼び出しリスト内の残りメソッド呼び出されません。呼び出し元で例外キャッチされても、この動作変わりません。

デリゲート呼び出したメソッドシグネチャ戻り値含まれる場合デリゲート呼び出しリスト内の最後要素戻り値返します参照渡しされたパラメータシグネチャ含まれる場合、そのパラメータ最終的な値は、呼び出しリスト内のすべてのメソッド順次実行されたことによって更新され結果の値になります

コンパイラBeginInvokeEndInvoke という 2 つ追加メソッドデリゲート提供します。これらのメソッド詳細については、「同期メソッド非同期呼び出し」を参照してください

デリゲート最も近い C または C++機能関数ポインタです。デリゲートは、静的メソッドまたはインスタンス メソッドを表すことができますデリゲートインスタンス メソッド表している場合デリゲートは、そのメソッドエントリ ポイントへの参照だけでなく、クラス インスタンスへの参照格納してます。関数ポインタとは異なりデリゲートオブジェクト指向タイプ セーフ機能です。

使用例使用例

標準デリゲート定義する方法次の例に示します

Imports System

Public Class SamplesDelegate

   ' Declares a delegate for a method that takes in an int and returns
 a String.
   Delegate Function myMethodDelegate(myInt
 As Integer) As [String]

   ' Defines some methods to which the delegate can point.
   Public Class mySampleClass

      ' Defines an instance method.
      Public Function myStringMethod(myInt
 As Integer) As [String]
         If myInt > 0 Then
            Return "positive"
         End If
         If myInt < 0 Then
            Return "negative"
         End If
         Return "zero"
      End Function 'myStringMethod

      ' Defines a static method.
      Public Shared Function
 mySignMethod(myInt As Integer) As
 [String]
         If myInt > 0 Then
            Return "+"
         End If
         If myInt < 0 Then
            Return "-"
         End If
         Return ""
      End Function 'mySignMethod
   End Class 'mySampleClass

   Public Shared Sub Main()

      ' Creates one delegate for each method.
      Dim mySC As New mySampleClass()
      Dim myD1 As New myMethodDelegate(AddressOf
 mySC.myStringMethod)
      Dim myD2 As New myMethodDelegate(AddressOf
 mySampleClass.mySignMethod)

      ' Invokes the delegates.
      Console.WriteLine("{0} is {1}; use the sign ""{2}"".",
 5, myD1(5), myD2(5))
      Console.WriteLine("{0} is {1}; use the sign ""{2}"".",
 - 3, myD1(- 3), myD2(- 3))
      Console.WriteLine("{0} is {1}; use the sign ""{2}"".",
 0, myD1(0), myD2(0))

   End Sub 'Main

End Class 'SamplesDelegate 


'This code produces the following output:
' 
'5 is positive; use the sign "+".
'-3 is negative; use the sign "-".
'0 is zero; use the sign "".


using System;
public class SamplesDelegate  {

   // Declares a delegate for a method that takes in an int and returns
 a String.
   public delegate String myMethodDelegate( int
 myInt );

   // Defines some methods to which the delegate can point.
   public class mySampleClass  {

      // Defines an instance method.
      public String myStringMethod ( int myInt
 )  {
         if ( myInt > 0 )
            return( "positive" );
         if ( myInt < 0 )
            return( "negative" );
         return ( "zero" );
      }

      // Defines a static method.
      public static String mySignMethod ( int
 myInt )  {
         if ( myInt > 0 )
            return( "+" );
         if ( myInt < 0 )
            return( "-" );
         return ( "" );
      }
   }

   public static void Main()
  {

      // Creates one delegate for each method.
      mySampleClass mySC = new mySampleClass();
      myMethodDelegate myD1 = new myMethodDelegate( mySC.myStringMethod
 );
      myMethodDelegate myD2 = new myMethodDelegate( mySampleClass.mySignMethod
 );

      // Invokes the delegates.
      Console.WriteLine( "{0} is {1}; use the sign \"{2}\".",
 5, myD1( 5 ), myD2( 5 ) );
      Console.WriteLine( "{0} is {1}; use the sign \"{2}\".",
 -3, myD1( -3 ), myD2( -3 ) );
      Console.WriteLine( "{0} is {1}; use the sign \"{2}\".",
 0, myD1( 0 ), myD2( 0 ) );
   }

}


/*
This code produces the following output:
 
5 is positive; use the sign "+".
-3 is negative; use the sign "-".
0 is zero; use the sign "".
*/ 

using namespace System;
delegate String^ myMethodDelegate( // Declares a delegate for a method
 that takes in an int and returns a String.
int myInt );

// Defines some methods to which the delegate can point.
ref class mySampleClass
{
public:

   // Defines an instance method.
   String^ myStringMethod( int myInt )
   {
      if ( myInt > 0 )
            return ("positive");

      if ( myInt < 0 )
            return ("negative");

      return ("zero");
   }


   // Defines a static method.
   static String^ mySignMethod( int myInt )
   {
      if ( myInt > 0 )
            return ("+");

      if ( myInt < 0 )
            return ("-");

      return ("");
   }

};

int main()
{
   
   // Creates one delegate for each method.
   mySampleClass^ mySC = gcnew mySampleClass;
   myMethodDelegate^ myD1 = gcnew myMethodDelegate( mySC, &mySampleClass::myStringMethod
 );
   myMethodDelegate^ myD2 = gcnew myMethodDelegate( mySampleClass::mySignMethod );
   
   // Invokes the delegates.
   Console::WriteLine( "{0} is {1}; use the sign \"{2}\".", 5,
 myD1( 5 ), myD2( 5 ) );
   Console::WriteLine( "{0} is {1}; use the sign \"{2}\".", 
 -3, myD1(  -3 ), myD2(  -3 ) );
   Console::WriteLine( "{0} is {1}; use the sign \"{2}\".", 0,
 myD1( 0 ), myD2( 0 ) );
}

/*
This code produces the following output:

5 is positive; use the sign "+".
-3 is negative; use the sign "-".
0 is zero; use the sign "".
*/
import System.*;

public class SamplesDelegate
{
    /** @delegate 
     */
    // Declares a delegate for a method that takes in an int and returns
    // a String.
    public delegate String MyMethodDelegate(int
 myInt);

    // Defines some methods to which the delegate can point.
    public static class
 MySampleClass
    {
        // Defines an instance method.
        public String MyStringMethod(int myInt)
        {
            if (myInt > 0)  {
                return "positive";
            }
            if (myInt < 0) {
                return "negative";
            }
            return "zero";
        } //myStringMethod

        // Defines a static method.
        public static String MySignMethod(int
 myInt)
        {
            if (myInt > 0) {
                return "+";
            }
            if (myInt < 0) {
                return "-";
            }
            return "";
        } //MySignMethod
    } //MySampleClass

    public static void main(String[]
 args)
    {
        // Creates one delegate for each method.
        MySampleClass mySC = new MySampleClass();
        MyMethodDelegate myD1 = new MyMethodDelegate(mySC.MyStringMethod);
        MyMethodDelegate myD2 = new MyMethodDelegate(MySampleClass.MySignMethod);
        // Invokes the delegates.
        Console.WriteLine("{0} is {1}; use the sign \"{2}\"."
,
 
            (Int32)(5), System.Convert.ToString(myD1.Invoke(5)), 
            System.Convert.ToString(myD2.Invoke(5)));
        Console.WriteLine("{0} is {1}; use the sign \"{2}\"."
,
            System.Convert.ToString(-3), System.Convert.ToString(myD1.Invoke(-3))
,
            System.Convert.ToString(myD2.Invoke(-3)));
        Console.WriteLine("{0} is {1}; use the sign \"{2}\"."
,
 (Int32)(0),
            System.Convert.ToString(myD1.Invoke(0)), System.Convert.ToString(
            myD2.Invoke(0)));
    } //main
} //SamplesDelegate 

/*
This code produces the following output:
 
5 is positive; use the sign "+".
-3 is negative; use the sign "-".
0 is zero; use the sign "".
*/

継承階層継承階層
System.Object
  System.Delegate
     System.MulticastDelegate
スレッド セーフスレッド セーフ
この型の public static (Visual Basic では Shared) メンバはすべて、スレッド セーフです。インスタンス メンバ場合は、スレッド セーフであるとは限りません。
プラットフォームプラットフォーム
バージョン情報バージョン情報
参照参照



英和和英テキスト翻訳>> Weblio翻訳
英語⇒日本語日本語⇒英語
  

辞書ショートカット

すべての辞書の索引

「Delegate クラス」の関連用語

Delegate クラスのお隣キーワード
検索ランキング

   

英語⇒日本語
日本語⇒英語
   



Delegate クラスのページの著作権
Weblio 辞書 情報提供元は 参加元一覧 にて確認できます。

   
日本マイクロソフト株式会社日本マイクロソフト株式会社
© 2025 Microsoft.All rights reserved.

©2025 GRAS Group, Inc.RSS