C#事件演示程序3)——体会事件更本质的东西

C# 事件(Event)详解 定义委托类型:声明事件的委托类型。定义事件:使用event关键字声明事件。触发事件:通过委托触发事件。//声明委托类型//声明事件//触发事件的方法MyEvent?");//触发事件//事件处理方法//订阅事件//触发事件事件是基于委托的,提供了一个严格的方式来管理方法的调用,尤其适用于需要通知和异步操作的场景。• 事件允许发布-订阅模式,使得多个对象能够订阅并响应特定的事件 阅读详情
我在上篇 文章中对事件的分析还是比较片面的。这是昨天晚上回家又仔细研究了一下才发现的。
因为我本来就觉得有些地方还是没弄清楚。比如事件的代理一定是EventHandler或派生类吗?签名必须有参数吗?某个类对事件的注册只能写在类的内部构造函数中吗?不能写在外部吗?其事件处理函数只能是非静态的吗?不能是静态的吗?昨天本以为对事件有了比较全面的认识了,但似乎总觉得哪里不对劲,或者似乎对事件的理解非常死板,思路自己都觉得僵化的很。隐隐带着这些疑问,又参考了一下《C#完全手册》,这些问题迎刃而解。
下面是我写的例子:
A)
using System;
using System.Collections.Generic;
using System.Text;

namespace ConsoleApplication4
{
    
public class Program
    
{
        
static void Main(string[] args)
        
{
            MyEvent myEventIns 
= MyEvent.Instance;
            
            MyListener Listener 
= new MyListener();
            myEventIns.myEvent 
+= new MyDelegate(Listener.DisplayString);
            
            myEventIns.OnMyEvent();

        }

    }


    
public class MyListener
    
{
        
public MyListener()
        
{
        }

        
public void DisplayString()
        
{
            Console.WriteLine(
"hello!Welcome to my blog!");
        }

    }


    
public delegate void MyDelegate();
    
public class MyEvent
    
{
        
private static MyEvent _instance = new MyEvent();
        
public static MyEvent Instance
        
{
            
get return _instance; }
        }

        
private MyEvent()
        
{
        }

        
public event MyDelegate myEvent;

        
public void OnMyEvent()
        
{
            RaiseMyEvent();
        }

        
private void RaiseMyEvent()
        
{
            
if (myEvent != null)
            
{
                myEvent();
            }

        }

    }

}

B)把事件处理方法改成静态的:
 
using System;
using System.Collections.Generic;
using System.Text;

namespace ConsoleApplication4
{
    
public class Program
    
{
        
static void Main(string[] args)
        
{
            MyEvent myEventIns 
= MyEvent.Instance;
            
//Listener Listener = new Listener();
            myEventIns.myEvent += new MyDelegate(Listener.DisplayString);
            myEventIns.OnMyEvent();

        }

    }


    
public class Listener
    
{
        
//public Listener()
        
//{
        
//    MyEvent.Instance.myEvent += new MyDelegate(DisplayString);
        
//}
        
//public void DisplayString()
        
//{
        
//    Console.WriteLine("hello!Welcome to my blog!");
        
//}
        public static void DisplayString()
        
{
            Console.WriteLine(
"hello!Welcome to my blog!");
        }

    }


    
public delegate void MyDelegate();
    
public class MyEvent
    
{
        
private static MyEvent _instance = new MyEvent();
        
public static MyEvent Instance
        
{
            
get return _instance; }
        }

        
private MyEvent()
        
{
        }

        
public event MyDelegate myEvent;

        
public void OnMyEvent()
        
{
            RaiseMyEvent();
        }

        
private void RaiseMyEvent()
        
{
            
if (myEvent != null)
            
{
                myEvent();
            }

        }

    }

}

C#委托与事件:1个本质区别,2个常见误解,3个最佳实践 本文深入解析了C#中委托与事件的核心概念与应用。文章首先通过实际案例对比委托与事件的区别,指出委托是类型安全的函数指针,而事件是委托的封装。接着详细介绍了委托和事件的"三步魔法"实现方法,包括基础语法、多播机制等核心知识点。重点剖析了两者的本质区别:委托作为类型可被直接赋值,而事件作为包装只能通过"+=/-="操作。最后澄清了常见误解,强调事件不仅限于GUI编程,而是适用于各种解耦场景。全文以代码示例为主线,配合精炼注解,帮助开发者快速掌握这两种重要机制。 阅读详情

相关推荐

C#从现象到本质,随书源码。

本书详细介绍用C#语言进行程序开发需要掌握的知识和技术。全书由浅入深分三大部分,共21章,部分“基础知识”,包括.NET基础知识、C#类型基础、C#的面向对象技术、字符串、垃圾回收、异常处理;第二部分“C#特性”,包括委托和事件、泛型、反射、数据结构、LINQ的相关技术、动态语言运行时;第三部分“多线程和异步”,包括多线程的概念、多线程同步、异步编程理论与实例、任务并行库等。本书精选大量案例,循序渐进地讲解C#语言,内容丰富而翔实,并给出练习题,帮助读者好地巩固所学知识,提升能力。前言和附录分别给出.NET程序员开发职位要求、技能等级、进阶之路,以及面试宝典,可帮助开发者新人快速进阶,找到适合自己的工作。

C#事件本质

event字段本质就是对委托进行私有访问限制,事件本质就是委托,只不过系统会对用event字段修饰的委托进行了特殊处理,比如自动生成一个私有的委托变量,添加两个事件访问器,同时禁止外部类对事件的Invoke等方法调用。

491

c#小游戏实例之星空大战

浅显易懂,工具VS2010 类库2.0的Winform程序

C#事件

1.事件的概念 1)C#事件本质就是对消息的封装,用作对象之间的通信;发送方叫事件发送器,接收方叫事件接收器; 2)发送器不知道接收器的任何情况,但接收器有一个事件处理程序来处理这个事件(当事件发生时);那么发送器和接收器之间如何进行通信呢?用事件3)简单地来理解把事件理解成消息即可 2.事件的工作方式 1)事件是根据发布者或预定者模型设计的。 2)触发事件的类称为发布者;对事件

1645

C#事件概念

原则:1、C#事件本质就是对消息的封装,用作对象之间的通信;发送方叫事件发送器,接收方叫事件接收器;2、发送器不知道接收器的任何情况,但接收器有一个事件处理程序来处理这个事件(当事件发生时);那么发送器和接收器之间如何进行通信呢?用事件,用委托,简单地来理解把事件理解成消息即可。先定义个委托,要使用的事件处理程序的签名(也就是函数类型,返回值,参数个数,参数类型等等)由这个委托定义,委

todototry的专栏 1万+

C#进阶】C# 事件

🌍 hello大家好啊,我是哈桑。本文为大家介绍 C# 中的事件事件本质上来讲是一种特殊的多播委托1,只能从声明它的类中进行调用。事件通常用于表示用户操作,例如单击按钮或图形用户界面中的菜单选项。C# 中常常会使用事件来实现线程之间的通信。不仅是在类中,在接口中也可以声明事件,称为接口事件。接口事件的实现和接口上的方法或属性的实现是一样的,以一个示例来说明如何在类中实现接口事件

好学若饥,谦卑若愚。 5277

C#中委托和事件

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

andu1644的博客 1万+

C#事件本质

C#中的事件本质论最近一段时间在学习C#中的一些比较抽象的东西,就比如说委托和事件,反反复复的学习了几次之后,感觉能稍微懂了一些,在这里和一些学习C#的同学一起来分享一下在说事件之前,先简单的看一下委托什么是委托比如我们有以下的三个需求 1:将一个字符串数组的每个元素都转换成大写字母 2:将一个字符串数组的每个元素都转换成小写字母 3:将一个字符串数组的每个元素两边加上双引号最开始我们都

qq_33520498的博客 1354

c#程序设计实训报告心得体会_c#学习心得体会范文_c#程序设计心得体会

C#是一种安全的、稳定的、简单的、优雅的,由C和C++衍生出来的面向对象的编程语言。现结合自身,谈谈一些心得体会。本文是学习c#心得体会范文,仅供参考。刚学习C#的时候,感觉很难,做的时候出现很多错误而且我是照着书打代码还有错误,那时的感觉是迷茫的。在学习的过程中,我还是坚持下来,虽然学的不是很好,但是慢慢就理解了,现在也不要仿照书打代码。现在讲讲做项目的感想。我们项目做不好也有一个小原因,是因为...

weixin_39573822的博客 1万+

探寻C#事件本质

我最先在学习C#事件的时候,阅读了许多书籍,但总是不能对事件建立起一个比较清晰的概念,对其内部机制和原理也是似是而非,因为这些书籍在描述事件的时候总是夹杂许多其他不能理解的抽象术语,相信许多初学者都有这样的感觉。同时,在利用IDE进行GUI编程时,IDE总是在内部帮助我们实现了事件必须的一些代码,我们只需双击对象,编事件处理函数就行了,而我们常常对内部的工作一无所知,或没有去主动理解这些自动生

C#入门之路 2083

C#事件

一、事件基础 1、事件简介 事件常用于对某一消息作出的反应。当某一事件被触发之后,就会对其做出对应的响应。 连接消息和反馈动作的符号为+=,符号左侧表示发出的消息,右侧表示对消息做出的响应函数 2、事件提示及查看 在输入对象加点号后,VS会出现智能提示,其分别代表: 小扳手:表示属性 立方体:表示函数或方法 闪电:表示事件 二、常见事件示例 1、定时器事件Timer 要包含对应的命名空间:using System.Timers; 指定时间间隔,然后每到指定的间隔就响应一次,代码如下:

Jeffxu_lib的博客 8122

C# 委托与事件总结

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

萌宅鹿的技术小屋 2574

Study C#事件本质

一、引言  C#是个面向组件的程序,允许编写事件(Event),以便让对象以非同步的方式通知其他对象。实际上事件(Event)就是一个回呼(callback)的函数指针(Function Pointer),在C#中是通过delegate达成的。 二、描述  1、原始方式(订阅者模式)  比如:有一个人,有吃饭的方法,在吃完饭后他可以sleep/shopping。此时,您让他sleep,当他

傻大专栏 905

C#学习之事件本质

在注册事件时,使用EventHandler委托; // 摘要: // 表示将用于处理不具有事件数据的事件的方法。 // // 参数: // sender: // 事件源。 // // e: // 不包含事件数据的对象。 public delegate void EventHandler(o...

黄海几吹夏 576

C#事件-探寻事件本质

<br />如何定义一个事件?<br />语法:访问修饰符 event关键字 委托类名 事件名;<br />比如:public event somedelegatename myeventname;<br />事件到底是什么类型(引用?值?)<br />事件其实就是一个特殊的委托。<br />MSDN中的C#参考里这样描述:事件是特殊类型的多路广播委托,仅可从声明它们的类或结构(发行者类)中调用。如果其他类或结构订阅了该事件,则当发行者类引发该事件时,会调用其事件处理程序方法。<br />对于这一点,我们也

德仔 1241

对.net事件的看法

对.net事件的看法 一、事件本质 事件是软件系统里的两个子系统之间,或者两个模块之间,或者两个对象之间发送消息,并处理消息的过程。在面向对象的世界里,就可以统一认为是两个对象之间的行为。 两个对象之间发送的这种消息,对发送方来讲是产生一个事件,对接受方来讲是需要处理某个事件。这种消息可以是用户操作产生的或者软件系统里的某个对象产生的。 ...

weixin_34380948的博客 267

谈一谈C#事件本质

委托和事件本身没有可比性,因为委托是类型,事件是对象,常在一起比较的是委托的对象(用委托方式实现的事件)和(标准的event方式实现)事件的区别。两者的关系是:事件的内部是用委托实现的。        因为对于事件来讲,外部只能“注册自己+=、注销自己-=”,外界不可以注销其他的注册者,外界不可以主动触发事件,因此如果用Delegate就没法进行上面的控制,因此诞生了事件这种语法。(个人

LanQiuChaoRen的专栏 1225

C# 中的委托和事件本质讲解

C# 中的委托和事件 文中代码在VS2005下通过,由于VS2003(.Net Framework 1.1)不支持隐式的委托变量,所以如果在一个接受委托类型的位置直接赋予方法名,在VS2003下会报错,解决办法是显式的创建一个委托类型的实例(委托变量)。例如:委托类型 委托实例 = new 委托类型(方法名);欢迎浏览本文的后续文章:C#中...

weixin_30538029的博客 149
上一篇: C#事件演示程序2)——写事件的三点注意,以及常用的事件处理模型
下一篇: C#事件演示程序4)——一段经典的代码
马鸣风萧萧
博客等级 码龄24年 74粉丝 31原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值