澳门威利斯人_威利斯人娱乐「手机版」

来自 澳门威利斯人 2019-05-04 02:53 的文章
当前位置: 澳门威利斯人 > 澳门威利斯人 > 正文

标准事件模式

 

     上面定义贰个此委托项目类型的风云

  陆、使用和扩大伊芙ntArgs类

 

     这里定义了二个伊夫ntHandler类型的轩然大波Click

  2、选择伊夫ntHandler预约义委托类型。

    public class PriceChangedEventArgs : EventArgs
    {
        public readonly decimal LastPrice;
        public readonly decimal NewPrice;

        public PriceChangedEventArgs(decimal lastPrice, decimal newPrice)
        {
            LastPrice=lastPrice;
            NewPrice= newPrice;
        }
    }

     进一步证实了自家的反驳。上面大家来做3个近似的例证来帮衬了然。

  一、委托的回到类型为void;

注意:

      }

  public event MyEventHandler PrintComplete
  {
    add
    {
      //..
    }
    remove
    {
      //..
    }
  }

为了幸免对EventArgs不要求的初阶化,提议采纳伊夫ntArgs.Empty属性。使用那样一个“空的”静态引用的目的,幸免多余地去制造八个新对象。

       this.textBox1.KeyPress =newSystem.Windows.Forms.KeyPressEventHandler(this.textBox1_KeyPress);

  既然伊芙ntHandler委托不能够利用了,那么就唯有思量动用自定义委托来声称事件了。首先声明一(Beingmate)个自定义委托:

在底下例子中,大家定义伊芙ntArgs的子类,用于事件PriceChanged被吸引时,传递新旧Price值:

     大概我们开掘在C#中稍加事件和目前的就像不太雷同。比如

图片 1

选用或概念事件的委托,需遵照三条标准:

using System;
class MyMyEventArgs:EventArgs
{
 private char keyChar;
 public MyMyEventArgs(char keyChar)
 {
  this.keychar=keychar;
 }
 public char KeyChar
 {
  get
  {
   return keyChar;
  }
 }
}

  完整的二个轩然大波例子:

class Test 
        public static void Main()
        {
            InitializeComponent();
            Stock stock = new Stock("THPW");
            stock.Price = 27.10M;
            //注册PriceChanged事件
            stock.PriceChanged  = stock_PriceChanged;
            stock.Price = 31.59M;
        }

        static void stock_PriceChanged(object sender, PriceChangedEventArgs e)
        {
            if ((e.NewPrice - e.LastPrice) / e.LastPrice > 0.1M)
            {
                Console.WriteLine("Alert,10% stock increase!");
            }
        }
    }

    public class Stock
    {
        string symbol;
        decimal price;

        public Stock(string symbol)
        {
            this.symbol = symbol;
        }

        //定义委托事件
        public event EventHandler<PriceChangedEventArgs> PriceChanged;


        protected virtual void OnPriceChanged(PriceChangedEventArgs e)
        {
            if (PriceChanged != null) PriceChanged(this, e);
        }

        public decimal Price
        {
            get { return price; }
            set
            {
                if (price == value) return;

            price = value;

          OnPriceChanged(new PriceChangedEventArgs(price, value));

            }
        }
    }

    public class PriceChangedEventArgs : EventArgs
    {
        public readonly decimal LastPrice;
        public readonly decimal NewPrice;

        public PriceChangedEventArgs(decimal lastPrice, decimal newPrice)
        {
            LastPrice=lastPrice;
            NewPrice= newPrice;
        }
    }    

4、轻便的自定义事件(贰)

  事件订阅者剧中人物要求订阅事件发表者发表的事件,那样技能在事变揭穿时接受到音信并作出响应,事件实际上是寄托项目,因而事件管理方法必须和嘱托签名相相称。假设事件选拔预订义的信托项目:伊夫ntHandler,那么相称它的事件管理方法如下:

.NET框架为事件定义了三个正规方式,它的目标是保持框架和用户代码之间的1致性。

    是参数为Key伊夫ntArgs的寄托。那为何KeyPress事件要如此做吗,我们得以从七个类的构造函数来找答案。

 事件,小编深信起先学C#的情侣都会用过,在C#中很常见,举个例子点击贰个按键,上传一张图片等等,在WinForm或WebForm中都在利用着事件。明日,趁着有少少事件,作者说了算来反复一下事先被自身略过的事物

 

     作者在Key伊夫ntArgs中又开采了性能

private void textBox1_MouseClick(object sender, MouseEventArgs e)
{
  Console.WriteLine(e.Clicks);
}

全部例子:

       //注意那种写法是错误的,因为委托是静态的

public delegate void EventHandler(Object sender,EventArgs e);
  • 委托必须以void作为重返值
  • 寄托必须承受三个参数:第一个是object类,第一个是伊芙ntArgs的子类。
  • 委托的名称必须以伊夫ntHandler结尾

     在写代码前我们先来熟识.net框架春日事件有关的类和嘱托,理解C#中预订义事件的拍卖。

  以下为扩展伊夫ntArgs类的言传身教:

正规事件的形式为主是System伊夫ntArgs——预约义的从未有过成员的框架类(差别于静态Empty属性)

     EventArgs是包涵事件数量的类的基类,用于传递事件的底细。

  事件是超过常规规的多路广播委托,事件暗许有二个私家的信托项目变量,用以保存对订阅事件的事件管理方法的引用,此委托项目标变量仅能从注解该事件的类中央委员托。事件订阅者通过提供对事件管理方法的引用来订阅事件,这么些方法通过暗许的大运访问器加多到委托的调用列表中。这里的风浪访问器类似于属性访问器,分歧之处在于,时间访问器被命名叫add和remove,而不是性质的get和set。在大多数情景下都无需提供自定义的风浪访问器。假如未有提供,则编写翻译器会自行抬高事件访问器。如若必要丰裕自定义事件访问器,以支撑有些自定义行为,能够利用如下语法:

    class Test
    {
        public static void Main()
        {
            InitializeComponent();
            Stock stock = new Stock();
            stock.Price = 27.10M;
            //注册PriceChanged事件
            stock.PriceChanged  = stock_PriceChanged;
            stock.Price = 31.59M;
        }

        static void stock_PriceChanged(object sender, EventArgs e)
        {
           Console.WriteLine("价格变换了!");
        }
    }

    public class Stock
    {
        decimal price;

        public event EventHandler PriceChanged;

        protected virtual void OnPriceChanged(EventArgs e)
        {
            if (PriceChanged != null) PriceChanged(this, e);
        }

        public decimal Price
        {
            get { return price; }
            set
            {
                if (price == value) return;
                price = value;

                //OnPriceChanged(new EventArgs());

                OnPriceChanged(EventArgs.Empty);
            }
        }
    }

     大家也定义2个伊芙ntArgs(类似Key伊芙ntArgs)取名My伊夫ntArgs,定义3个结构函数public My伊夫ntArgs(char keyChar),一样大家也设置相应的属性。代码如下

namespace ConsoleApplication1
{
    public class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("该做的东西做完,然后触发事件!");
            EventSample es = new EventSample();
            es.ShowComplete  = es.MyEventHandler;
            es.OnShowComplete();

            Console.ReadKey();
        }
    }

    public class EventSample
    {
     //定义一个事件
        public event EventHandler ShowComplete;
    
     //触发事件
        public void OnShowComplete()
        {
            //判断是否绑定了事件处理方法,null表示没有事件处理方法
            if (ShowComplete != null)
            {
          //像调用方法一样触发事件
                ShowComplete(this, new EventArgs());
            }
        }

        //事件处理方法
        public void MyEventHandler(object sender, EventArgs e)
        {
            Console.WriteLine("谁触发了我?"   sender.ToString());
        }
    }
}

上边例子中事件除了传递已发生音信,未有传递别的信息。

          public event EventHandler Click;

  public delegate void PrintEventDelegate(object sender,PrintEventArgs e);

伊芙ntArgs表示包罗事件数量的类的基类,并提供用于不带有事件数量的事件的值。用于为事件传递音信的基类。

一、了解C#中的预订义事件管理机制

  先来看看伊夫ntHandler委托的具名:

考虑到复用性,伊夫ntArgs子类依照它包涵的始末命名(而非依据将被选取的事件命名)。

     此代码不断的渴求用户输入字符,借使输入的结果是h,则触发OnUserRequest事件,事件的触发者是本人(this),事件细节无(未有传递任何参数的伊芙ntArgs实例)。大家给这么些类取名字为UserInputMonitor。

  那三种办法基本同样,只可是第二种是.Net Framework中广泛使用的1种样式,因而提议尽量选用第二种方法。

微软的超过50%控件所抛出的轩然大波都有七个参数,第一个是 object 类型的,第1个是 伊芙ntArgs 类型的。

     首先我们需求定义3个类来监听客户端事件,这里我们监听键盘的输入。

 

您能够选择 OnPriceChanged(new 伊芙ntArgs()) 来变成事件的传递。

     定义八个寄托。

图片 2

您从伊夫ntArgs  e这里得不到其余此次事件相关须求传递的音信,真正传递的信息都在sender中。

       }

  大家见到原本的伊夫ntArgs产生了Mouse伊夫ntArgs。

万一事件不传递额外的消息,能够行使预约义的非泛化委托EventHandler。如下所示:

       public delegate void KeyEventHandler( object sender , KeyEventArgs e );

    public void SomeEventHandler(object sender, EventArgs e)
    { 
        //..
    }

 

         public void Run()
       {
       bool finished=false;
       do
       {
        if (Console.ReadLine()=="h")
        {
         OnUserRequest(this,new EventArgs());
        }  
       }while(!finished);
       }

图片 3

图片 4

          public delegate void EventHandler( object sender , EventArgs e )

  壹、选用自定义委托项目。

       private void ShowMessage(object sender,EventArgs e)
       {
           Console.WriteLine("HaHa!!");
       }

  enentSample.PrintComplete  = ShowMessage;  //此行代码编译器报错

       public KeyPressEventArgs(char keyChar);

一、sender:传递触发委托的对象;
2、伊夫ntArgs:传递事件的底细;
三、EventHandler:用于受托方法;
4、delegate:方法的包装,允许将艺术传递过去;

        UserInputMonitor monitor=new UserInputMonitor();

  有了事件管理方法,就能够订阅事件了,只必要采纳加法赋值运算符( =)就可以。

         monitor.run();

  2、事件和嘱托的关联

本文由澳门威利斯人发布于澳门威利斯人,转载请注明出处:标准事件模式

关键词: 澳门威利斯人 asp.net技术 C#