.NET委任、イベント、Lambda式


依頼


依頼は何ですか。


依頼は参照タイプ(実はクラスで、MulticastDelegateの特殊なクラスを継承しています).特定のパラメータのリストと戻りタイプを持つメソッドへの参照を示します.
各依頼はInvokeメソッド,BeginInvokeおよびEndInvoke非同期メソッドを提供する

なぜ依頼が必要なのですか?

  • 依頼は、方法(すなわち論理)をパラメータとすることができる.
  • 論理デカップリング、安定性を維持.
  • コードを多重化し、プロジェクト規範を保証する.


  • 依頼の使用方法


    委任の宣言、インスタンス化、および使用方法


    委任の宣言
    delegate void Del(string str);
    static void Notify(string name)
    {
        Console.WriteLine($"Notification received for: {name}");
    }
    

    インスタンス化依頼
    Del del1 = new Del(Notify);
    //C# 2.0
    Del del2 = Notify;
    

    依頼の呼び出し
    del1.Invoke("  ");
    del2("  ");
    

    その他の使用依頼
    //C# 2.0               
    Del del3 = delegate(string name)
    { Console.WriteLine($"Notification received for: {name}"); };
    //C# 3.0  lambda           
    Del del4 = name =>  { Console.WriteLine($"Notification received for: {name}"); };
    

    開発プロセスを簡素化する.NETには、委任タイプのセットが含まれています.
  • Action<>はパラメータを持ち、値を返さない.
  • Func<>はパラメータを持ち、パラメータによって指定されたタイプの値を返します.
  • Predicate<>は、パラメータが委任条件を満たすかどうかを決定するために使用される.

  • 実例


    コード:
    class Program
    {
        /// 
        ///     
        /// 
        /// 
        private delegate void KillDelegate(string fullName);
        static void Main(string[] args)
        {
            //     
            var killWithKnifeDelegate = new KillDelegate(KillWithKnife);
            Kill("  ", killWithKnifeDelegate);
    
            var killWithSwordDelegate = new KillDelegate(KillWithSword);
            Kill("  ", killWithSwordDelegate);
    
            var killWithAxeDelegate = new KillDelegate(KillWithAxe);
            Kill("   ", killWithAxeDelegate);
    
            Console.ReadKey();
        }
    
        static void Kill(string fullName, KillDelegate killDelegate)
        {
            Console.WriteLine($"{fullName}    ");
            //    
            killDelegate.Invoke(fullName);
            Console.WriteLine($"{fullName}  10  ");
        }
    
        static void KillWithKnife(string fullName)
        {
            Console.WriteLine($"{fullName}     ");
        }
        static void KillWithSword(string fullName)
        {
            Console.WriteLine($"{fullName}     ");
        }
        static void KillWithAxe(string fullName)
        {
            Console.WriteLine($"{fullName}     ");
        }
    }
    

    Lambda式


    Lambdaって何?


    Lambdaは依頼を使うより便利な文法です.
    //C# 2.0               
    Del del3 = delegate(string name)
    { Console.WriteLine($"Notification received for: {name}"); };
    //C# 3.0  lambda           
    Del del4 = name =>  { Console.WriteLine($"Notification received for: {name}"); };
    

    なぜLambdaが必要なの?


    開発プロセスをシンプル化し、パフォーマンスに影響を与えることはありません.

    Lambdaの使い方


    式lambdaの基本形式:
    //   lambda          ,       ;        
    (input-parameters) => expression
    

    ゼロ入力パラメータをカッコで指定します.
    Action line = () => Console.WriteLine();
    

    かっこ内の2つ以上の入力パラメータはカンマで区切られます.
    Func testForEquality = (x, y) => x == y;
    

    ステートメントlambda
    (input-parameters) => {  }
    

    文lambdaの主体は任意の数の文を含むことができる.
    Action greet = name =>
    {
        string greeting = $"Hello {name}!";
        Console.WriteLine(greeting);
    };
    greet("World");
    // Output:
    // Hello World!
    

    匿名委任とlambdaコードを使用します.
    public static void Main(string[] args)
    {
        List list = new List();
        for (int i = 1; i <= 100; i++)
        {
            list.Add(i);
        }
    
        //      
        List result = list.FindAll(
          delegate (int no)
          {
              return (no % 2 == 0);
          }
        );
        foreach (var item in result)
        {
            Console.WriteLine(item);
        }
        
        //  Lambda
        List result = list.FindAll(i => i % 2 == 0);
        foreach (var item in result)
        {
            Console.WriteLine(item);
        }
    }    
    

    ≪イベント|Events|ldap≫


    事件は何ですか。


    イベントは、主にメッセージまたは通知の伝達に使用される特殊な委任タイプです.イベントはイベントのパブリケーションタイプからのみ呼び出すことができ、イベント送信者を表すオブジェクトとSystemを有するEventHandler依頼に基づいていることが多い.イベントに関するデータを含むEventArgs派生クラス.

    委任とイベントはいつ使用しますか?

  • リスニングイベントはオプションです.サブスクリプション・サーバによって提供されるコードを呼び出す必要がある場合は、委任ベースの設計を使用します.サブスクリプション・サーバを呼び出さずにすべての作業を完了できるコードがある場合は、イベント・ベースの設計を使用します.
  • 戻り値には委任が必要です.イベントに使用される委任には無効な戻りタイプがあり、イベントハンドラはイベントパラメータオブジェクトの属性を変更することによってイベントソースに情報を返します.
  • イベントには専用の呼び出しがあります.イベントを含むクラス以外のクラスはイベントリスナーを追加および削除するしかありません.イベントを呼び出すには、イベントを含むクラスのみです.

  • イベントの使用方法


    イベントのパブリッシュ


    イベントデータの定義
    public class CustomEventArgs : EventArgs
    {
        public CustomEventArgs(string message)
        {
            Message = message;
        }
    
        public string Message { get; set; }
    }
    

    パブリッシュクラス内のイベントの宣言
    public delegate void CustomEventHandler(object sender, CustomEventArgs args);
    public event CustomEventHandler RaiseCustomEvent;
    
    //      
    public event EventHandler RaiseCustomEvent;
    

    イベントの購読


    イベントハンドラメソッドの定義
    void HandleCustomEvent(object sender, CustomEventArgs a)  
    {  
       // Do something useful here.  
    } 
    

    (+=)を使用して購読イベントを追加
    publisher.RaiseCustomEvent += HandleCustomEvent;  
    

    (-=)を使用してイベントの購読を解除
    publisher.RaiseCustomEvent -= HandleCustomEvent;  
    

    using System;
    namespace DotNetEvents
    {
        //         
        public class CustomEventArgs : EventArgs
        {
            public CustomEventArgs(string message)
            {
                Message = message;
            }
            public string Message { get; set; }
        }
        //       
        class Publisher
        {
            //   EventHandler     
            public event EventHandler RaiseCustomEvent;
            public void DoSomething()
            {
                RaiseCustomEvent(new CustomEventArgs("Event triggered"));
            }
        }
        //      
        class Subscriber
        {
            private readonly string _id;
            public Subscriber(string id, Publisher pub)
            {
                _id = id;
                //       
                pub.RaiseCustomEvent += HandleCustomEvent;
            }
            //             。
            void HandleCustomEvent(object sender, CustomEventArgs e)
            {
                Console.WriteLine($"{_id} received this message: {e.Message}");
            }
        }
        class Program
        {
            static void Main()
            {
                var pub = new Publisher();
                var sub1 = new Subscriber("sub1", pub);
                var sub2 = new Subscriber("sub2", pub);
                //          
                pub.DoSomething();
                Console.ReadKey();
            }
        }
    }
    

    リファレンス

  • 依頼https://docs.microsoft.com/zh...
  • Lambda式https://docs.microsoft.com/zh...
  • イベントhttps://docs.microsoft.com/zh...