c#委托几篇好文章 续篇

C# 委托 C#委托Delegate, func, action 阅读详情

大白话系列之C#委托与事件讲解(三)

[我希望大家在看完文章的时候,多做做练习,自己也可以想个场景,动动手,这样才会有深刻的印象,不然遗忘的速度非常快]

今天我接着上面的3篇文章来讲一下,为什么我们在日常的编程活动中遇到这么多sender,EventArgs e 参数:
protected void Page_Load(object sender, EventArgs e)
{

}

protected void btnSearch_Click(object sender, ImageClickEventArgs e)
{

}

protected void grdBill_RowDataBound(object sender, GridViewRowEventArgs e)
{
           
}
那他们到底表示什么呢?

在回答上面的问题之前,我们先搞懂 .Net Framework的编码规范:

一、委托类型的名称都应该以EventHandler结束。 
二、委托的原型定义:有一个void返回值,并接受两个输入参数:一个Object 类型,一个 EventArgs类型(或继承自EventArgs)。 
三、事件的命名为 委托去掉 EventHandler之后剩余的部分。 
四、继承自EventArgs的类型应该以EventArgs结尾。

这就是微软编码的规范,当然这不仅仅是规则,而是在这种规则下使程序有更大的灵活性,那我们就继续重构第三讲的例子,让他符合微软的规范。

复制代码
代码
     // 所有订阅者【Subscriber】感兴趣的对象,也就是e,都要继承微软的EventArgs
    
// 本例中订阅者【也称观察者】MrMing,MrZhang他们感兴趣的e对象,就是杂志【magazine】
     public   class  PubEventArgs : EventArgs
    {
        
public   readonly   string  magazineName;
        
public  PubEventArgs()
        {
 
        }
        
public  PubEventArgs ( string  magazineName)
        {
           
this .magazineName  =  magazineName;
        }
    }

    
// 发布者(Publiser)
     public   class  Publisher
    {
        
// 声明一个出版的委托
        
// 这里多了一个参数sender,它所代表的就是Subject,也就是监视对象,本例中就是Publisher
         public   delegate   void  PublishEventHander( object  sender ,PubEventArgs e);
        
// 在委托的机制下我们建立以个出版事件
         public   event  PublishEventHander Publish;

        
// 声明一个可重写的OnPublish的保护函数
         protected   virtual   void  OnPublish(PubEventArgs e)
        {
            
if  (Publish  !=   null )
            {
                
// Sender = this,也就是Publisher
                 this .Publish( this , e);
            }
        }

        
// 事件必须要在方法里去触发
         public   void  issue( string  magazineName)
        {
            OnPublish(
new  PubEventArgs(magazineName));
        }
    }

    
// Subscriber 订阅者
     public   class  MrMing
    {
        
// 对事件感兴趣的事情
         public   static   void  Receive( object  sender,PubEventArgs e)
        {
            Console.WriteLine(
" 嘎嘎,我已经收到最新一期的《 " + e.magazineName + " 》啦!! " );
        }
    }

    
public   class  MrZhang
    {
        
// 对事件感兴趣的事情
         public   static   void  Receive( object  sender, PubEventArgs e)
        {
            Console.WriteLine(
" 幼稚,这么大了,还看《火影忍者》,SB小明! " );
            Console.WriteLine(
" 这个我定的《 " + e.magazineName + " 》,哇哈哈! " );
        }
    }

    
class  Story
    {
        
public   static   void  Main( string [] args)
        {
            
// 实例化一个出版社
            Publisher publisher  =   new  Publisher();

            Console.Write(
" 请输入要发行的杂志: " );
            
string  name  =  Console.ReadLine();

            
if  (name  ==   " 火影忍者 " )
            {
                
// 给这个出火影忍者的事件注册感兴趣的订阅者,此例中是小明
                publisher.Publish  +=   new  Publisher.PublishEventHander(MrMing.Receive);
                
// 发布者在这里触发出版火影忍者的事件
                publisher.issue( " 火影忍者 " );
            }
            
else
            {
                
// 给这个出火影忍者的事件注册感兴趣的订阅者,此例中是小明[另一种事件注册方式]
                publisher.Publish  +=  MrZhang.Receive;
                publisher.issue(
" 环球日报 " );
            }
            Console.ReadKey();
        }
    }
复制代码

 

输入火影忍者后,触发小明订阅的事件

显示

通过例子我再做一次说明,其实我们不用把Sender,e想的过于可怕

一、委托声明原型中的Object类型的参数代表了Subject,也就是监视对象,在本例中是 Publisher(出版社)。。 
二、EventArgs 对象包含了Observer所感兴趣的数据,在本例中是杂志。

 

 

 大家先休息休息,让大脑放松放松,先让我们看句名人名言:

 很多事情就像看A片,看的人觉得很爽,做的人未必!

 “中国人的励志和国外的励志存在非常大的不同,中国的励志比较鼓励人立下大志愿,卧薪尝胆,有朝一日成富成贵。而国外的励志比较鼓励人勇敢面对现实生活,面对普通人的困境,虽然结果也是成富成贵,但起点不一样,相对来说,我觉得后者在操作上更现实,而前者则需要用999个失败者来堆砌一个成功者的故事。”

 

好了,我们接着讲我们的委托与事件,其实如果大家对设计模式精通的话,其实他们关联的是观察者(Observer)模式,这里我就不再描述什么是观察者模式了,只是简单讲一下他们的关联:

在C#的event中,委托充当了抽象的Observer接口,而提供事件的对象充当了目标对象。委托是比抽象Observer接口更为松耦合的设计。

如果看不懂的话也没关系,当大家OO达到一定程度了,自然而然就会明白。

 

最后我们来看一个我们日常最最常用的观察者模式:

场景:当我们用信用卡刷完钱的时候,我们就会接收到手机短信,或者是电子邮件,其实这就是Observer pattern

 

复制代码
代码
    // ---本例场景为当用户从银行账号里取出钱后,马上通知电子邮件和发手机短信---
    
// 本例中的订阅者,也就是观察者是电子邮件与手机
    
// 发布者,也就是被监视对象是银行账号


    
// Obverser电子邮件,手机关心的对象e ,分别是邮件地址、手机号码、取款金额
     public   class  UserEventArgs : EventArgs
    {
        
public   readonly   string  emailAddress;
        
public   readonly   string  mobilePhone;
        
public   readonly   string  amount;
        
public  UserEventArgs( string  emailAddress,  string  mobilePhone, string  amount)
        {
            
this .emailAddress  =  emailAddress;
            
this .mobilePhone  =  mobilePhone;
            
this .amount  =  amount;
        }
    }

    
// 发布者,也就是被监视的对象-银行账号
     class  BankAccount
    {
        
// 声明一个处理银行交易的委托
         public   delegate   void  ProcessTranEventHandler( object  sender, UserEventArgs e);
        
// 声明一个事件
         public   event  ProcessTranEventHandler ProcessTran;

        
protected   virtual   void  OnProcessTran(UserEventArgs e)
        {
            
if  (ProcessTran  !=   null )
            {
                ProcessTran(
this , e);
            }
        }

        
public   void  Prcess(UserEventArgs e)
        {
            OnProcessTran(e);
        }
    }

    
// 观察者Email
     class  Email
    {
        
public   static   void  SendEmail( object  sender, UserEventArgs e)
        {
            Console.WriteLine(
" 向用户邮箱 "   +  e.emailAddress  +   " 发送邮件:您在 " + System.DateTime.Now.ToString() + " 取款金额为 " + e.amount);
        }
    }

    
// 观察者手机
     class  Mobile
    {
        
public   static   void  SendNotification( object  sender, UserEventArgs e)
        {
            Console.WriteLine(
" 向用户手机 "   +  e.mobilePhone  +   " 发送短信:您在 "   +  System.DateTime.Now.ToString()  +   " 取款金额为 "   +  e.amount);
        }
    }

    
// 订阅系统,实现银行系统订阅几个Observer,实现与客户端的松耦合
     class  SubscribSystem
    {
        
public  SubscribSystem()
        {
 
        }

        
public  SubscribSystem(BankAccount bankAccount, UserEventArgs e)
        {
            
// 现在我们在银行账户订阅2个,分别是电子邮件和手机短信
            bankAccount.ProcessTran  +=   new  BankAccount.ProcessTranEventHandler(Email.SendEmail);
            bankAccount.ProcessTran 
+=   new  BankAccount.ProcessTranEventHandler(Mobile.SendNotification);
            bankAccount.Prcess(e);
        }
    }

    
class  Client
    {
        
public   static   void  Main( string [] args)
        {
            Console.Write(
" 请输入您要取款的金额: " );
            
string  amount  =  Console.ReadLine();
            Console.WriteLine(
" 交易成功,请取磁卡。 " );
            
// 初始化e
            UserEventArgs user  =   new  UserEventArgs( " jinjiangbo2008@163.com " " 18868789776 " ,amount);
            
// 初始化订阅系统
            SubscribSystem subject  =   new  SubscribSystem( new  BankAccount(), user);
            Console.ReadKey();
        }
    }
复制代码

 

 

 控制台

 

网上还有个热水器烧水的OBSERVER PATTERN 也是蛮经典的,大家可以看看。

下一讲我们要讲讲,在我们的日常的MES系统开发中,到底在什么场景用到委托事件,毕竟我们学了这样的技术,我们必须要用起来,这才有价值嘛!

呵呵!下讲,将会更加精彩!

六自由度机器人(机械臂)运动学建模及运动规划系列(四)——轨迹规划 本篇介绍了六轴机器人关节空间以及笛卡尔空间轨迹规划的简单方法,并给出了一种几何解法,以简化规划过程,并提供了简单的Matlab轨迹规划函数介绍。 阅读详情

相关推荐

Git救援:如何从误操作中恢复未提交的更改

摘要:本文探讨了误操作git reset --hard导致未提交更改丢失后的恢复方法。首先分析git reflog的局限性,随后介绍利用IDE本地历史记录(如IntelliJ IDEA和VS Code)进行文件恢复的具体步骤。最后建议使用文件系统恢复工具(如Linux的extundelete或Windows的Recuva)作为备选方案。文章强调定期提交的重要性,同时提供了意外发生时可行的恢复策略,帮助开发者尽可能挽回丢失的工作内容。(149字)

2501_90323865的博客 104

安卓手机客户端App查询数据库源程序

安卓手机客户端App源程序,演示如何用在手机App查询数据库 跨平台开发,你也可以发布在IOS,安卓和Win平台上. XE7以上版本通用.

C# 委托和事件 (详细讲解)

C# 讲解委托和事件的好文章集合。 包括: C# 委托妙文 C# 委托和事件 C# 委托使用方法 C# WndProc的使用方法 文档内有详细代码,您一定可以用它学会委托和事件!

大白话系列之C#委托与事件讲解(三)

[我希望大家在看完文章的时候,多做做练习,自己也可以想个场景,动动手,这样才会有深刻的印象,不然遗忘的速度非常快] 今天我接着上面的3篇文章来讲一下,为什么我们在日常的编程活动中遇到这么多sender,EventArgs e 参数:protected void Page_Load(object sender, EventArgs e){ } protected void btnSe...

金刚 303

C#委托和事件

关于委托和事件分享三个博客内容: 首先说明下: (1)C#中事件:事件时属于类的成员,所以要放在类的内部。 (2)委托属于一个定义,是和类、接口类似的,通常放在外部。 (因为大多数委托都要被重用) 委托定义在类里面还是类外面视情况而定,一般定义在与类定义平级部分, 且用public修饰,便于外部调用。 若定义在类的内部,则必须通过调用该类的成员才能取得其委托的引用, 频繁...

andu1644的博客 1万+

c#委托(大白话)

C#中的委托是一种类型,可以看作是带有函数指针的对象。它可以用来引用一个或多个方法,这些方法可被调用,并且它们具有相同的签名。可以理解为是一种类型安全的回调机制,使得我们能够在运行时动态地向程序中添加和移除事件处理函数。总结:委托C# 中一种很有用的机制,可以帮助我们编写出更灵活的代码。它允许我们将方法作为参数传递,或者将多个方法组合成一个集合,以便在需要时进行调用。使用委托时,我们可以通过实例化一个委托对象来绑定具体的方法,以便在需要的时候调用。,其中 TResult 是返回值类型。

2301_78270249的博客 299

C# 中的委托和事件(详解)

C# 中的委托和事件 委托和事件在 .NET Framework 中的应用非常广泛,然而,较好地理解委托和事件对很多接触 C# 时间不长的人来说并不容易。它们就像是一道槛儿,过了这个槛的人,觉得真是太容易了,而没有过去的人每次见到委托和事件就觉得心里堵得慌,浑身不自在。本章中,我将由浅入深地讲述什么是委托、为什么要使用委托、事件的由来、.NET Framework 中的委托和事件、委托中方法异常和超时的处理、委托与异步编程、委托和事件对Observer 设计模式的意义,对它们的编译代码也做了...

tiankongzhicheng441x的博客 8855

c#委托

转自:http://baike.baidu.com/link?url=QEIloem1vJUB0q0HTR_8xJL1P3yv3eL4eNDUA7yrlJXKkC-RFdrFC65rwDYP4KNJ58w_7L355Jg_sQ-4FChg1K c#委托 目录 引言 参数 委托 由来 编译代码 设计模式 委托事件 展开 引言 参数 委

pamxy啲Coding窝... 977

C# 委托详解

委托委托的使用,多播委托,泛型委托

鲤籽鲲的博客 2万+

C#高级--委托详解

C#高级–委托详解 一、委托是什么 1、委托是什么 ​ 委托和类一样是一种用户自定义类型,它存储的就是一系列具有相同签名和返回类型的方法的地址,调用委托的时候,它所包含的所有方法都会被执行。 2、委托声明 (1)委托可以声明在类外部,也可以在类内部 (2)跟方法有点类似,有参数,返回值,访问修饰符,比方法声明多一个关键字delegate namespace MyDelegate { /// <summary> /// 1.无参数无返回值委托 /// <

李宥的博客 1万+

C#委托

文章目录一、C#委托二、隐式类型与匿名类型三、C#扩展方法与yield关键字四、Lambda表达式 一、C#委托 举例1: 创建控制台应用程序 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace TheOne { //声明委托 public delegate string Translatio

weixin_46596213的博客 4411

C#委托与事件

委托C#中的一个引用类型。它允许捕捉对方法的引用,并像传递其他对象那样传递该引用,也可以像调用其他方法一样调用被捕捉的方法。{a+b}我们同样可以使用C#为我们声明好的委托和。其中,代表有返回值的方法,代表无返回值的方法。{a+b}{a}{Name}{Age}...

夜槿笙歌的博客 9101

C#进阶】C# 委托

🔘 大家好,我是哈桑。本章为大家介绍 C# 中的委托委托是一种特殊的引用类型,是用来实现对相同参数列表和返回类型的方法的封装。委托可以将方法作为参数传递给其他方法,也是定义回调方法1的理想选择。

好学若饥,谦卑若愚。 2529

C# 委托与事件总结

C# 中的委托和事件可以说是超级拦路虎了,一个不小心就容易让人直接放弃学习。最近几天花了点时间钻研了一下,查看了一些资料,希望做个总结。 我还达不到技术大佬的级别,主要就是做个**自我总结**,很推荐大家看一下我下面发的参考资料里的文章和视频,那些是真正的大佬产出的内容。

萌宅鹿的技术小屋 2576

大白话系列之C#委托与事件讲解(一)

    从序言中,大家应该对委托和事件的重要性有点了解了吧,虽然说我们现在还是能模糊,但是从我的大白话系列中,我会把这些概念说的通俗易懂的。首先,我们还是先说说委托吧,从字面上理解,只要是中国人应该都知道这个意思,除非委托2个中文字不认识,举个例子,小明委托小张去买车票。     但是在我们的程序世界里,也是这么的简单吗?当然,什么是OO,OO就是现实世界的抽象,所有现实世界的事物,在O...

金刚 471

转大白话系列之C#委托与事件讲解(三)

[我希望大家在看完文章的时候,多做做练习,自己也可以想个场景,动动手,这样才会有深刻的印象,不然遗忘的速度非常快] 今天我接着上面的3篇文章来讲一下,为什么我们在日常的编程活动中遇到这么多sender,EventArgs e 参数:protected void Page_Load(object sender, EventArgs e){ } protected void btnSearch_...

weixin_33709590的博客 240

白话C#委托

委托是一种动态调用方法的类型,属于引用型。委托是对方法的抽象和封装。委托对象实质上代表了方法的引用(即内存地址)。委托通常是委托某个方法来实现具体的功能。当我们调用委托的时候,委托包含的所有方法将被执行。虽然在定义委托时与方法有些相似,但我们不能将其称为方法。

MarcoPro的博客 779

大白话系列之C#委托与事件讲解

大白话系列之C#委托与事件讲解(序言) 大白话系列之C#委托与事件讲解(一)   大白话系列之C#委托与事件讲解(二)     从序言中,大家应该对委托和事件的重要性有点了解了吧,虽然说我们现在还是能模糊,但是从我的大白话系列中,我会把这些概念说的通俗易懂的。首先,我们还是先说说委托吧,从字面上理解,只要是中国人应该都知道这个意思,除非委托2个中文字不认识,举个例子,小明委托

wolf96的专栏 2641

工作十余年,还是一直被问 委托和事件 有什么区别? 真是够了

一:背景1. 讲故事前几天公司一个妹子问我,事件和委托有什么区别?先由衷感叹一下,编码十余年,年轻的时候常被面试官问起,现在年长了,却被后辈们时常问候,看样子逃离编码生涯之前是跑不掉了,...

dotNET跨平台 1174

(1992-2022年)中国省、市、县夜间灯光数据集-最新整理!!!

1、资源内容地址:https://blog.csdn.net/2301_79696294/article/details/1445196482、代码特点:今年全新,手工精心整理,放心引用,数据来自权威,相对于其他人的控制变量数据准确很多,适合写论文做实证用 ,不会出现数据造假问题3、适用对象:大学生,本科生,研究生小白可用,容易上手!!!3、课程引用: 经济学,地理学,城市规划与城市研究,公共政策与管理,社会学,商业与管理本数据包含excel格式和shp格式。数据名称:全国各省、市、县夜间灯光数据大全数据年份:1992-2022年数据指标:均值、总和、最小值、最大值、标准差。

上一篇: c# 委托事件 看到的几篇好文章
下一篇: 用simple mapi 发送一个带附件的邮件
pirate97
博客等级 码龄16年 27粉丝 9原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值