cxi依頼のよくある使い方


この文章は私の一つの白の委託に対する理解とまとめです。
委託は一種の後期結合機構であり、はっきりと言えば、呼び出し時に業務ロジックを伝達するアルゴリズムである。
依頼の作成文法:

public delegate int Comparison<in T>(T left, T right);//            demo
文法は変数または方法の署名を宣言するように見えるが、実装はタイプを宣言している。コンパイラは、System.Multicast Delegateから派生したクラス(System.Multiast DelegateがSystem.Delegateから派生したクラス)を生成します。タイプ名は、依頼の名前と同じです。Invoke、Beginninvoke、EndInvokeなどの方法があります。コンパイラはまた、この新しいタイプのために、インスタンスのコールリストにメソッドを追加して削除することができるように、処理サービスを追加して生成します。
依頼はクラスの内部、名前空間(クラスと同級)、グローバル名空間(不推奨)に定義されてもよい。

//     
public delegate int Comparison<in T>(T left, T right);
namespace Test
{
  //          
  public delegate int Comparison2<in T>(T left, T right);
  public class Student
  {
    //      
    public delegate int Comparison3<in T>(T left, T right);
  }
}
委託の定義割り当て
依頼をカテゴリとして使う(委託自体はクラス)。

//    
public delegate int Comparison<in T>(T left, T right);
public class Test
{
  //  
  private Comparison<int> comparator;
  public void Show()
  {
    //      ,        ,    ,                 。
    this.comparator = Compare;
    //   
    this.comparator(1, 2);     //         this.comparator.Invoke(1, 2);
  }
  private int Compare(int left, int right) => left.CompareTo(right);
}
依頼の目的として使用する方法が「小さい方法」である場合、通常は、lamda表現文法を使用して、割り当てを実行します。

Comparison<string> comparer = (left, right) => left.Length.CompareTo(right.Length);
 マルチキャスト依頼
通常は単一の目標方法を委託に添付するだけです。しかし、委託先は、複数の対象方法を一つの依頼先の呼び出しリストに付加することを確実にサポートしており、マルチキャスト依頼と呼ぶ。マルチキャスト依頼とは、呼び出しを依頼する際に複数の方法を呼び出すことができることを意味し、複数の方法を依頼することができる。

private int Cal(int num) {return num * num;}
private void button1_Click(object sender, EventArgs e)
{
   Func<int, int> action = null;
   //  +=   -=           
   action += a => { Console.WriteLine($" {1}   " + a); return a + 1; };
   action += Cal;
   action += a => { Console.WriteLine($" {3}   " + a); return a + 3; };
   action -= Cal;
   //        ,             
   int a = action(5);
   Console.WriteLine(a);
}
常用汎型依頼
戻り値なし

public delegate void Action();
public delegate void Action<in T>(T arg);
public delegate void Action<in T1, in T2>(T1 arg1, T2 arg2);
// Other variations removed for brevity.
戻り値があります

public delegate TResult Func<out TResult>();
public delegate TResult Func<in T1, out TResult>(T1 arg);
public delegate TResult Func<in T1, in T2, out TResult>(T1 arg1, T2 arg2);
// Other variations removed for brevity
ブックタイプを返します

public delegate bool Predicate<in T>(T obj);
注意:ネットコールプラットフォームでは、委託先方法の非同期呼び出しはサポートされていません。

 Action action = () => Console.WriteLine("     ");
 AsyncCallback asyncCallback = a => Console.WriteLine("     " + a);
 //System.PlatformNotSupportedException:“Operation is not supported on this platform.”
 IAsyncResult result = action.BeginInvoke(asyncCallback, "asdf"); //        
 action.EndInvoke(result);
 イベントイベント
イベントはイベントキー付きの依頼の一例であり、イベントは外部呼び出し(invoke)と直接割当(=)によって制限され得る。依頼はタイプですが、イベントは依頼タイプの一例です。
一つのイベントを宣言するのは簡単です。委託先を宣言する時にイベントのキーワードを加えればいいです。

/// <summary>
///       
/// </summary>
/// <param name="name"></param>
public delegate void ShowInfo(string name);
public class Study
{
  /// <summary>
  ///       
  /// </summary>
  public event ShowInfo ShowInfo;
  public void Show()
  {
    ShowInfo += Study_ShowInfo;
    //   “publisher”    
    ShowInfo("asdf");
  }
  private void Study_ShowInfo(string name)
  {
    throw new NotImplementedException();
  }
}
イベントの場所では、委託で代替することができますが、イベントには一連の規則と制約があり、プログラムのセキュリティを保証するために使用されます。イベントは+=と-=のみです。このように、購読者は購読または購読操作をキャンセルすることができます。他の操作を実行する権限はありません。委託なら、予約者は、委託先に対して価値を再分配し(他の購読者は全部キャンセルされた)、さらにはnullに設定し、さらには購読者は直接に依頼を呼び出すことができ、これらは危険な操作であり、放送者は独占制御権を失ってしまう。
事件はプログラムの安全性と丈夫さを保証しました。
以上はcxi依頼の一般的な用法の詳細です。cxi依頼に関する資料は他の関連記事に注目してください。