c# の 事件




1.イベントの概念

イベントはメッセージの情報提供者として使用され、便利ですばやく作成できます。モジュール間に明確な境界が描かれ、アプリケーションの保守性と再利用性が向上します。
土語では、「何か」が発生したことを意味し、イベントは、発生したことを保存するための情報提供者として使用され、応答する必要のある複数のオブザーバーに送信されます。
一度もやったことがないこの人は、
簡単には理解できません。たとえば、泥棒のグループ、泥棒、密告者などがいて、私は警備員なので、いわゆる「事件」です。非常に優れた警備員として。「何かが起こった」後の状況を、泥棒の種類に応じて対応する黒い単語に事前に保存したい。たとえば、密告者の場合は「屋根からの脱出」、泥棒の場合は保存したい。それを保管するために-「裏口をすべる」など。スラング。「主人が帰ってきた」または「警察が来た」、私は「離れて屋根からの実行」と「バックドアを通ってSLEE」へのスナッチを知らせるためにスナッチを知らせるでしょうhappened-このとき「何か」...
私はホストがオブザーバーモードを確認することを提案します。イベントは実際には下部のオブザーバーパターンをカプセル化します。上記の例では、警備員が情報提供者、泥棒が監視者、所有者と警察が監視者です。イベントは、状況に応じて異なる応答を行い、一連の異なるまたは同じ通知(メッセージ)を「オブザーバー」としてクラスに送信します。

以前、このようなプログラムを作成したときは、待機メカニズムを使用することがよくありました。何かが発生するのを待つために、特定の判断変数を常に検出する必要がありました。イベントプログラミングの導入後、このプロセスは大幅に簡素化されました。





2.インシデントに注意を払う場所:

  1. クラスで宣言されています。
  2. パブリッシャーはクラスであり、サブスクライバーはクラスです。
  3. デリゲートを使用+=および-=追加または削除できます

パブリッシャーとサブスクライバーのパターン:

パブリッシャー:他の部分に関心がある可能性のある一連のイベントを定義します。他のクラスは「登録」して通知を受け取ることができます。

サブスクライバー:イベントが発生すると、パブリッシャーは「イベントをトリガー」してから、サブスクライバーによって送信されたすべてのイベントを実行します。



3.例

1.最初のイベントの例

namespace VsCore_Demo {
    
    

    public delegate void SaySomething (string name);
    class Program {
    
    
        public void SayHello (string name) {
    
    
            Console.WriteLine ("Hello," + name + "!");
        }
        public void SayNiceToMeetYou (string name) {
    
    
            Console.WriteLine ("Nice to meet you," + name + "!");
        }

        public event SaySomething come;
        public event SaySomething come2;



        public void test () {
    
    

            //声明两个委托.
            //声明委托的时候,传进去的参数是方法名。
            SaySomething sayhello = new SaySomething (SayHello);
            SaySomething saynice = new SaySomething (SayNiceToMeetYou);

            //把两个委托添加到事件里
            come += sayhello;
            come += saynice;

            //事件发生了。
            //触发事件是用事件直接加参数。
            come ("张三");
            System.Console.WriteLine("***********");
        }



        static void Main (string[] args) {
    
    
            Program program = new Program ();
            program.test ();
            Console.Read ();
        }
    }
}

イベント宣言は次のようになります。

 public event SaySomething come;

これは、comeイベントがデリゲートSaySomethingのみを扱っていることを示していますイベントが発生すると、これらのデリゲートはイベントによって呼び出され、次に特定の実装メソッドがデリゲートによって呼び出されます。

デリゲートをインスタンス化するには、クラスをインスタンス化するのと同じようにnewキーワードを使用してからパラメーターを渡しますが、このパラメーターは文字列型またはint型ではなく、メソッド名であることに注意してください。

            SaySomething sayhello = new SaySomething (SayHello);
            SaySomething saynice = new SaySomething (SayNiceToMeetYou);

戻って「イベント」の定義を見てみましょう。
public event SaySomething come;

ここでは「委任」の名前が示されているため、イベントにメソッドを直接追加し、「委任」のインスタンス化プロセスを省略できます。したがって、上記のtest()メソッドは次のように簡単に記述できます。

public void test()
 {
    
          
 come += SayHello;    
        come += SayNiceToMeetYou;   
        come("张三"); 
 }

委員会を刺激するとき、私は抽象化に戻り、パラメータを渡すだけでした。どのプロセスが途中であるかは問題ではありませんでした。

コミッション+イベントはオブザーバーパターンの典型的な例です。いわゆるコミッションは実際にはオブザーバーであり、特定のイベントを気にします。このイベントがトリガーされると、オブザーバーは行動します。

2.イベントの完了:ニャーと鳴く、目を覚ます、マウスを動かすための古典的なインタビューの質問

具体的なコードは次のとおりです。
注意すべき点がいくつかあります。

  • CatCall?.Invoke();イベントを呼び出します。
  • イベント+ =は次のように変換できます。ニャーと鳴くとマウスが走りました。
using System;

namespace DelegateDemo
{
    
    
    //定义猫叫委托
    public delegate void CatCallEventHandler();
    public class Cat
    {
    
    
        //定义事件
        public event CatCallEventHandler CatCall;
        //定义唤醒事件的方法
        public void OnCatCall()
        {
    
    
            Console.WriteLine("猫叫了一声");
            //唤醒事件。
            CatCall?.Invoke();
        }
    }
    public class Mouse
    {
    
    
        //定义老鼠跑掉方法
        public void MouseRun()
        {
    
    
            Console.WriteLine("老鼠跑了");
        }
    }
    public class People
    {
    
    
        //定义主人醒来方法
        public void WakeUp()
        {
    
    
            Console.WriteLine("主人醒了");
        }
    }

    class Program
    {
    
    
        static void Main(string[] args)
        {
    
    
            Cat cat = new Cat();
            Mouse m = new Mouse();
            People p = new People();
            //关联绑定 
            cat.CatCall += new CatCallEventHandler(m.MouseRun);
            cat.CatCall += new CatCallEventHandler(p.WakeUp);
            cat.OnCatCall();

            Console.ReadKey();
        }
    }
}

3. Appleの値下げコード:

イベントの標準形式が使用されます


    class Program
    {
    
    
        static void Main(string[] args)
        {
    
    
            Apple ap1 = new Apple()
            {
    
    
                Preice = 5288
            };

            //注册事件
            // 点了 += 以后,可以使用快捷键生成。
            ap1.myEvent += PriceChanged;

            //调整价格,触发事件
            ap1.Preice = 3999;

            Console.ReadKey();
        }


        //事件响应程序
        static void PriceChanged(object sender, MyEventArgs e)
        {
    
    
            Console.WriteLine("年终大促销,iPhone 6 只卖 " + e.NewPrice +" 元, 原价 " + e.OldPrice + " 元,快来抢!"+sender.ToString());
        }
    }


    /// <summary>
    /// 事件参数类
    /// </summary>
    public class MyEventArgs : EventArgs
    {
    
    
        public MyEventArgs(decimal newPrice, decimal oldPrice)
        {
    
    
            this.NewPrice = newPrice;
            this.OldPrice = oldPrice;
        }


        public readonly decimal NewPrice;
        public readonly decimal OldPrice;
    }


    /// <summary>
    /// 事件发布者类
    /// </summary>
    public class Apple
    {
    
    
        private decimal price;


        public decimal Preice
        {
    
    
            get
            {
    
    
                return price;
            }
            set
            {
    
    
                //如果价格变了,触发事件通知用户价格变了
                if (price == value)
                {
    
    
                    return;
                }


                decimal oldPrice = price;
                price = value;

                //调用触发事件的方法。
                //一般激活方法是 On + event
                OnRaiseEvet(new MyEventArgs(price, oldPrice));
            }
        }


        public event EventHandler<MyEventArgs> myEvent;

        //激发方法。
        public virtual void OnRaiseEvet(MyEventArgs e)
        {
    
    

            //如果调用列表不为空,则触发
            if (myEvent != null)
            {
    
    
                myEvent(this, e);

                //event关键字定义的事件只能由事件源对象自己激发,外界无法通过访问委托变量直接激发事件。
                //下面的代码无法编译通过:Publisher p = new Publisher(); p.MyEvent(10);
            }
        }
    }

イベントについて

  • イベントの主な目的は、加入者間の干渉を防ぐことです。
  • イベントを宣言するには、デリゲートの直前にイベントを追加します
  • 内部と外部には違いがあります。イベントがクラス内にある場合はデリゲートとして使用できますが、クラス外では+ =および– =操作のみを実行できます。
  • 通常の状況では、イベントをアクティブ化するメソッドは、デフォルトでOn + eventによって名前付けられます
  • CatCallをアクティブにしますか?.Invoke()
  • eventキーワードとして使用しますが、何が必須ですか?(1)包括的クラスでのみ、加入者にコミッションを送ることができます。(2)クラス外で=を使用することは許可されていません。
  • 送信者は、発行者クラスを出力するために使用されます。
  • イベントの場合、外部は自分自身を登録+ =、キャンセルすることはできます-=。外部は他の登録者をキャンセルすることはできません。


参照:

  1. c#クラシックインタビューの質問-Meow、Master Wake Up、Mouse Run(Processing of Incident)
  2. https://blog.csdn.net/shangrila_ftd/article/details/70148922
  3. Appleの値下げのソースコード
  4. https://zhidao.baidu.com/question/202695971.html

おすすめ

転載: blog.csdn.net/zhaozhao236/article/details/111351541