C#语法——事件,渐渐边缘化的长兄。

事件是C#的基本功之一,学好事件对于驾驭.NET框架大有益处。

事件最广大的比喻就是订阅,即,如若你订阅了自己的博客,那么,当我发布新博客的时候,你就会取得公告。

而以此历程就是事件,或者说是事件运行的轨道。

事件是分散,以自我的博客为着力,向所有订阅者发送音信。大家把那种分散称之为[多播]。

最普遍的事件用途是窗体编程,在Windows窗体应用程序和WPF应用程序中。

当在窗体中点击按钮,移动鼠标等事件时,相应的后台程序会接到通告,再实践代码。

事件的概念

合法对事件的表达是那样的:类或对象足以经过事件向别的类或对象公告发出的有关业务。

换成正常语言就是,事件能够定义成静态的或普通的,所以事件就足以由阐明的靶子调用,也足以直接通过类调用静态事件。

事件是C#中的一种档次,除了框架为大家定义好的风云外,大家还足以自定义事件,用event关键字来声称。

上边大家来看最基础的轩然大波定义。

public delegate void TestDelegate(string message);                                                  
public event TestDelegate testEvent;

俺们第一定义了一个寄托,然后选用event关键字,定义一个事件。

全体上看,好像就是在概念一个委托,只是在委托的定义在此之前,加了个event关键字。

不错,事件的概念就是那般,因为要声喜宝(Hipp)个事件,需求七个因素:

一,标识提供对事件的响应的章程的委托。

二,一个类,用存储事件的多少。即,事件要定义在类中。

上面大家来为那个事件赋值。

public void Init()
{   
    testEvent += new TestDelegate(EventSyntax_testEvent); 
    testEvent += EventSyntax_testEvent; 
}
private void EventSyntax_testEvent(string message)
{
    Console.WriteLine(message);
}

如代码所示,大家利用了+=这几个符号来为事件赋值,赋值的内容是一个信托和一个函数。

其中+=大家将她驾驭为【添加】。

代码中,大家拔取二种赋值格局,但实际上都是为事件test伊夫nt添加一个委。

第三种将函数直接【添加】到事件中,编译时也会把函数转换成委托【添加】到事件中。

系统提供事件

C#的框架都很经典,而种种经典框架都为大家提供了一部分经文事件。

是因为事件必须[标识响应措施的嘱托],所以这一个事件所选择的委托都有一个同步的特征,命名中隐含伊夫nt。

比如EventHandler,CancelEventHandler,RoutedEventHandler,ContextMenuEventHandler等。

其间最经典的就是伊夫ntHandler和Routed伊夫ntHandler。

EventHandler:

伊芙ntHandler定义如下

[SerializableAttribute]
[ComVisibleAttribute(true)]
public delegate void EventHandler(
 object sender,
 EventArgs e
)

她带有了七个参数,即当我们为事件添加伊芙ntHandler委托后,再去触发该事件;被触发的寄托将得到object
sender和伊芙ntArgs e四个参数。

sender:代表源,即触发该事件的控件。

e:代表事件参数,即触发该事件后,事件为被触发的寄托,传递了一部分参数,以便于委托在拍卖多少时,更方便。

基于这几个原理,大家得以分析出累累事物。

譬如说,当控件DataGrid的轩然大波被触发时,只要查看一下sender的真实类型,就足以通晓,到底是DataGrid触发的轩然大波,如故DataGridRow或DataGridCell触发的了。

RoutedEventHandler:

Routed伊芙ntHandler即路由事件,他的概念如下

public delegate void RoutedEventHandler(
 Object sender,
 RoutedEventArgs e
)

Routed伊夫ntHandler也为我们提供了sender和e多个参数。

但Routed伊芙ntHandler越发之处是,他的sender并不一定是实际的源,因为他是一个冒泡路由事件,即上升事件。

那边如若大家有好奇心去看官方文档,那么会在连锁的介绍中看到八个单词sender和source。

因此那五个单词,大家会清楚的问询路由事件。不难描述一下sender和source,它们一个是发送者,一个是源。

在伊芙ntHandler中,sender即source,因为它是一直事件。而在冒泡事件中,sender不一定等于source。即发送者不肯定是源。

下边大家用WPF来看望路由事件。

大家首先在XAML页面定义一个RadioButton按钮,然后设置他的模板是Button。然后分别定义各自的Click方法。

Xaml页面如下:

 <RadioButton Click="btnParent_Click">
            <RadioButton.Template>
                <ControlTemplate>
                    <StackPanel>
                        <TextBlock Text="我的名字" ></TextBlock>
                        <Button Content="Kiba518"   Click="btnClild_Click" ></Button>
                    </StackPanel>
                </ControlTemplate>
            </RadioButton.Template> 
</RadioButton> 

cs文件事件如下:

 private void btnParent_Click(object sender, RoutedEventArgs e)
 {
     string type = sender.GetType().ToString();//RadioButton
 }

 private void btnClild_Click(object sender, RoutedEventArgs e)
 {
     string type = sender.GetType().ToString();//Button
 }

运转起来,大家点击按钮,通过断点大家得以看看,大家点击的按钮触发了btnClild_Click和btnParent_Click事件

次第是先btnClild_Click后btnParent_Click。

经过取得sender的种类,我也可以看到,btnClild_Click的sender类型是Button,而btnParent_Click的sernder类型是RadioButton。

事件驱动编程

事件驱动编程那些概念给自家的感觉很怪,因为间接用C#,而C#的不少框架都是事件驱动的,所以一向觉得事件驱动是自然。

而当事件驱动设计这些词常常出现后,反而感到奇怪。

就象是,天天吃大米饭,突然有一天,所有人都说香米饭好香的觉得一样,你一听就感觉蹊跷。

因为事件驱动对于C#支出而言,实在太普通了。当然,那也得益于微软框架做的实在是太好了。

故而,我也不领会哪些在C#里讲事件驱动编程。因为使用C#的框架就是利用事件驱动编程。

事件和寄托到底是何等关联?

事件是用来多播的,并且用委托来为事件赋值,可以说,事件是依照委托来贯彻的。

但委托中也有多播,这为什么要独立弄出来一个轩然大波吧?

率先,存在即成立,事件一定有她存在的含义。 

事件存在的意思

本人对事件存在的意义是如此敞亮的。我们在C#编纂框架时,几乎不用委托的多播,因为委托的多播和事件存在严重的二义性。固然编写框架的人学会了动用委托的多播,但选择框架的同事可能并还不太娴熟,而且C#框架中,大多是选取事件来进行多播的。

之所以委托的多播和事件联合行使的框架,会造成选拔那么些框架的低档开发者很多迷惑,而这种疑心,会暴发众多不要求的标题。

例如,
你定义了一个委托,另一个开发者用那么些委托做了个多播,当第多少个开发者来保护那段代码时,假诺她是新手,不了然委托的多播,这就很有可能只修改了信托调用的代码。而从不去联合多播那个委托的代码。那系统就发出了隐藏的bug。

那就是说,事件和寄托到底是哪些关联吗?

事件与信托的确存在复杂的涉嫌,怎么讲都是不错的。但,C#开发者只必要记住,他们俩没关系即可。在C#事件是事件,委托是寄托。两者就就好像int和string一样,没有其他涉及。

缘由很粗略,学习的长河中尽量下跌概念混淆。而且,在C#支出中,好的架构者也常见会将事件和信托分离,所以,就觉得事件和寄托没有涉及即可。

结语

实在事件很好明白,一点不复杂。我在写那篇小说的长河中,也没悟出什么特其余或者说比较高级的用法。

但忠实的使用场景中,我的感到是,随着MVVM的成人,事件实际在被逐级放弃。即便微软做了诸多经典的事件驱动框架。但那都是过去了。

譬如WPF即使扶助事件驱动,但MVVM在WPF下的显现堪称完美,所以WPF下的风浪大概从不人用了。

再譬如前端的Angularjs等框架,提供了优质的MVVM使用效益,也让新的前端设计师逐步抛弃了事件。

于是,事件在未来的编程中,很可能将不在有那么重大的位置了。但学好事件,对于大家知道微软框架,依然有很大扶持的。

C#语法——元组类型

C#语法——泛型的有余用到

C#语法——await与async的不易打开方式

C#语法——委托,架构的血液

我对C#的认知。


注:此作品为原创,欢迎转发,请在篇章页面鲜明地方给出此文链接!
若你认为那篇小说还不错,请点击下右下角的【推荐】,很是感谢!
假诺你认为这篇小说对你有所支持,那就不妨支付宝小小打赏一下吧。 

图片 1

 

相关文章