本文先前家用电器在《C一道菜一道菜》正文中。,单击此处可探望一览表以获取更多通信。。

一、付托初窥:宾语与办法

  (1)实质:饲料一种或多种办法。宾语;付托在不同典型宾语。,使生效代表性质上是使生效饲料的方法。。假如你从C的角度忧虑代表权,可以忧虑为典型冷藏箱、正视宾语的有或起作用指示性的者

  (2)健康状况如何家用电器付托?

    宣言付托典型(付托关键词)

    家用电器付托典型宣言付托变量。

    三。增多付托典型的办法。

    使调动付托使生效办法。

  (3)付托的恒常性:

  团结付托、增多付托 =和付托的办法=移除办法,实际上,他们不注意被修正。。实际上,付托是常数。

  当您为付托添加和移除办法时会发作什么?先前使成为了独一新的付托。,使调动列表是添加和移除办法的最后。。

  (4)付托转变:

  简略决定因素付托演示

  delegatevoid MyDel(int value); //宣言付托典型class Program
    {
        void PrintLow(int value)
        {
            ("{0} - LowValue", value);
        }

        void PrintHigh(int value)
        {
            ("{0} - HighValue", value);
        }

        staticvoid Main(string[] args)
        {
            Program program = new Program();

            MyDel myDel; //宣言付托典型

            //获取0~99中间的独一随机数字
            Random random = new Random();
            int randomValue = (99);

            //使成为独一使详细化详细办法的付托宾语并将其诊断给myDel变量
            myDel = randomValue < 50 ?
                new MyDel() : new MyDel();

            //使生效付托            myDel(randomValue);

            ();
        }
    }

   ②简略无决定因素多办法列表付托DEMO

delegatevoid PrintFunction();

class Test
{
   publicvoid Print1()
   {
      ( "Print1 -- instance" );
   }

   publicstaticvoid Print2()
   {
      ( "Print2 -- static" );
   }
}

class Program
{
   staticvoid Main()
   {
      Test t = new Test();                 
      PrintFunction pf;                        
      pf = t.Print1; 

      pf += Test.Print2;
      pf += t.Print1;
      pf += Test.Print2;

      if ( pf != null )                         
      {
          pf();    
       }                          
      else
       {  
           ( "Delegate is empty" ); 
       }
   }
}            

  ③带重提值的付托DEMO

delegateint MyDel(); 

class MyClass
{
   int IntValue = 5;

   publicint Add2()
   {
      IntValue += 2; 
      return IntValue;
   }

   publicint Add3()
   {
      IntValue += 3; 
      return IntValue;
   }
}

class Program
{
   staticvoid Main()
   {
      MyClass mc = new MyClass();

      MyDel mDel = mc.Add2;      
      mDel += mc.Add3;          
      mDel += mc.Add2;          

      ( "Value: {0}", mDel() );
   }
}

二、隐姓埋名办法:惭愧,我匿了

  以付托方法停止的,假如办法只家用电器一次,这种情况下,此外使成为付托基本原理在远处,用不着使成为独一孤独的命名办法。。终于,隐姓埋名办法应运而生。

  隐姓埋名办法是在设定初值付托时内联(inline)宣言的办法

  让本人看一下编码的两个版本。:命名办法与隐姓埋名办法的构成,隐姓埋名办法更简洁扼要的吗?

  ①具名决定因素

  隐姓埋名决定因素

三、Lambda脸色:可口之物的基本原理糖

  (1)实质:理想化的事物基本原理的”基本原理糖“;

Lambda起点:1920年到1930年某一时代的,数学家Alonzo Church以及对立面人发明了Lambda一体化。Lambda一体化是用于表现有或起作用的一套零碎,它家用电器希腊字母Lambda(λ表达难确切表达的效能。晚近,有或起作用式制作节目说闲话(如Lisp)家用电器上面所说的事术语来表现可以目前的扮演有或起作用规定的脸色,脸色不再必要著名的人物。。

  (2)要点:

    λ脸色击中要害决定因素列表(决定因素数量)、典型和使获得座位只得与付托相婚配。;

    2。脸色击中要害决定因素列表不确定的必要,除非您有独一REF或OUT关键词,不然您只得在此处显示宣言;

    假如不注意决定因素,只得家用电器一组空间歇。;

  (3)文法:

四、事件初窥:颁布者和用户典范

  重压用户Schema规定了一对多的信任相干。,让多个订阅者宾语同时监听某独一主旋律宾语。主件宾语在正式的翻转时发作多样化。,它将关照接受订户。,使他们可以自动更新他们的正式的。。

  用户供给物的办法称为回调办法。,由于发行物服现役的经过使调动订阅服现役的来使生效这些办法。。还可以将它们称为事件处置顺序,由于它们是为处置事件而使调动的编码。

  上面是独一佛经的编码,看一眼上面所说的事典范是健康状况如何家用电器的。:

using System;

delegatevoid Handler();

class Incrementer
{
   publicevent Handler CountedADozen;

   publicvoid DoCount()
   {
      for ( int i=1; i < 100; i++ )
         if ( i % 12 == 0 && CountedADozen != null )
            CountedADozen();
   }
}

class Dozens
{
   publicint DozensCount { get; privateset; }

   public Dozens( Incrementer incrementer )
   {
      DozensCount = 0;
      incrementer.CountedADozen += IncrementDozensCount;
   }

   void IncrementDozensCount()
   {
      DozensCount++;
   }
}

class Program
{
   staticvoid Main()
   {
      Incrementer incrementer = new Incrementer();
      Dozens dozensCounter    = new Dozens( incrementer );

      ();
      ( "Number of dozens = {0}",
                               );
   }
}

五、事件全过程:宣言、订阅和撞

  (1)宣言事件:

      ①事件宣言在独一类中;

    ②附加的办法需与付托典型的署名和重提典型婚配;

    ③宣言为public;

    ④无法new;

  (2)订阅事件:

    ①家用电器+=为事件增多事件处置顺序;

    ②可以家用电器隐姓埋名办法和Lambda脸色;

  (3)撞事件:

    ①家用电器事件著名的人物,前面跟的决定因素列表使详细化在圆间歇中;

    ②决定因素列表只得与事件的付托典型相婚配;  

六、走向规范途径:EventHandler

  顺序的异步处置是家用电器C#事件的极好调准瞄准器。Windows GUI范围广泛的地家用电器了事件,到某种状态事件的家用电器,.NET边框供给物了独一规范典范:EventHandler付托典型。

  (1)第独一决定因素防护用品撞事件的宾语的援用(object典型,可以婚配一些典型的转变);

  (2)次货个决定因素防护用品正式的通信(EntAsGrass类的转变),指示性的什么顺序依从的家用电器顺序。;

  (3)重提典型完全无用。;

  如今让本人重行体系用户类。,家用电器规范EvthHANDLE付托典型:

class Dozens
{
   publicint DozensCount { get; privateset; }

   public Dozens( Incrementer incrementer )
   {
      DozensCount = 0;
      incrementer.CountedADozen += IncrementDozensCount;
   }

   void IncrementDozensCount( object source, EventArgs e )
   {
      DozensCount++;
   }
}

  这么,无论如何为了防守规范典范而通知的。,本人结果却有两个决定因素。,第独一是撞事件的宾语援用,次货个是EngEngsS类的围住。,健康状况如安在事件中发送信号档案呢?答案必定是在次货个决定因素上找到离子交换漏过点。本人可以宣言独一从EngEngsS派生的子集。,在在这里,本人宣言要发送信号给PRES的决定因素的属性。。TIPS:提议家用电器EventArgs规定自规定子集的著名的人物。。

publicclass IncrementerEventArgs : EventArgs
{
   publicint IterationCount { get; set; } 
}

  如今家用电器自规定类,这么在事件的对立面几局部中要家用电器该自规定类还只得反而泛型付托和宣言自规定类宾语。

class Incrementer
{
   publicevent EventHandler CountedADozen;

   publicvoid DoCount()
   {
      IncrementerEventArgs args = new IncrementerEventArgs();
      for ( int i=1; i < 100; i++ )
         if ( i % 12 == 0 && CountedADozen != null )
         {
            args.IterationCount = i;
            CountedADozen( this, args );
         }
   }
}

  在使生效顺序中获取发送信号的档案值。,您可以目前的从事件派生的自规定类的属性。。

class Dozens
{
   publicint DozensCount { get; privateset; }

   public Dozens( Incrementer incrementer )
   {
      DozensCount = 0;
      incrementer.CountedADozen += IncrementDozensCount;
   }

   void IncrementDozensCount( object source, IncrementerEventArgs e )
   {
      ( "Incremented at iteration: {0} in {1}",
                                             e.IterationCount, source.ToString() );
      DozensCount++;
   }
}

本章的认为导图

附件

  认为导图(JPG)、PDF和MMAP源文档下载: