[C#]Event相关的三个典型Case收录.
基本版:
using System; namespace EventDemo1
{
public delegate void CatCallEventHandler();
public class Cat
{
//定义猫叫事件
public event CatCallEventHandler CatCall;
public void OnCatCall()
{
Console.WriteLine("猫叫了一声");
CatCall?.Invoke();
}
}
public class Mouse
{
//定义老鼠跑掉方法
public void MouseRun()
{
Console.WriteLine("老鼠跑了");
}
}
public class People
{
//定义主人醒来方法
public void WakeUp()
{
Console.WriteLine("主人醒了");
}
} class Program
{
static void Main(string[] args)
{
Cat cat = new Cat();
Mouse m = new Mouse();
People p = new People();
//关联绑定
cat.CatCall += new CatCallEventHandler(m.MouseRun);
cat.CatCall += new CatCallEventHandler(p.WakeUp);
cat.OnCatCall(); Console.ReadKey();
}
}
}
升级版:
using System; namespace EventDemo2
{
class Program
{
public static void Main(string[] args)
{
//实例化对象
Mom mom = new Mom();
Dad dad = new Dad();
Child child = new Child(); //将爸爸和孩子的Eat方法注册到妈妈的Eat事件
//订阅妈妈开饭的消息
mom.Eat += dad.Eat;
mom.Eat += child.Eat; //调用妈妈的Cook事件
mom.Cook(); Console.Write("Press any key to continue . . . ");
Console.ReadKey(true);
}
} public class Mom
{
//定义Eat事件,用于发布吃饭消息
public event Action Eat; public void Cook()
{
Console.WriteLine("妈妈 : 饭好了");
//饭好了,发布吃饭消息
Eat?.Invoke();
}
} public class Dad
{
public void Eat()
{
//爸爸去吃饭
Console.WriteLine("爸爸 : 吃饭了。");
}
} public class Child
{
public void Eat()
{
//熊孩子LOL呢,打完再吃
Console.WriteLine("孩子 : 打完这局再吃。");
}
}
}
专业版:
using System; namespace EventDemo3
{
public class CustomEventArgs : EventArgs
{
public CustomEventArgs(string s)
{
message = s;
}
private string message; public string Message
{
get { return message; }
set { message = value; }
}
} // 发布者
class Publisher
{
// 使用 EventHandler<T> 声明事件
public event EventHandler<CustomEventArgs> RaiseCustomEvent; public void DoSomething()
{
// 可以在这里处理一些有用的事,然后触发事件
// 也可以在一些代码之前触发事件
OnRaiseCustomEvent(new CustomEventArgs("Did something"));
} // 把事件调用包含在一个 protected virtual 方法中,这样可以允许
// 子类重写事件调用
protected virtual void OnRaiseCustomEvent(CustomEventArgs e)
{
// 使用一个事件临时的引用,可以避免一种可能的竞争条件:
// 如果最后一个订阅者在 null 检查之后,事件触发之前突然
// 取消事件订阅
EventHandler<CustomEventArgs> handler = RaiseCustomEvent; // 如果没有订阅者,handler 将会是 null
if (handler != null)
{
// 格式化事件参数中的额外信息
e.Message += $" at {DateTime.Now}"; // 使用 () 操作符触发事件
handler(this, e);
}
}
} // 订阅者
class Subscriber
{
private string id;
public Subscriber(string ID, Publisher pub)
{
id = ID;
// 使用 C# 2.0 语法订阅事件
pub.RaiseCustomEvent += HandleCustomEvent;
} // 定义事件触发时要进行的操作
void HandleCustomEvent(object sender, CustomEventArgs e)
{
Console.WriteLine(id + " received this message: {0}", e.Message);
}
}
class Program
{
static void Main(string[] args)
{
Publisher pub = new Publisher();
Subscriber sub1 = new Subscriber("sub1", pub);
Subscriber sub2 = new Subscriber("sub2", pub); // 调用触发事件的方法
pub.DoSomething(); // 保持控制台一直打开
Console.WriteLine("Press Enter to close this window.");
Console.ReadLine();
}
}
}
[C#]Event相关的三个典型Case收录.的更多相关文章
- Python进阶----异步同步,阻塞非阻塞,线程池(进程池)的异步+回调机制实行并发, 线程队列(Queue, LifoQueue,PriorityQueue), 事件Event,线程的三个状态(就绪,挂起,运行) ,***协程概念,yield模拟并发(有缺陷),Greenlet模块(手动切换),Gevent(协程并发)
Python进阶----异步同步,阻塞非阻塞,线程池(进程池)的异步+回调机制实行并发, 线程队列(Queue, LifoQueue,PriorityQueue), 事件Event,线程的三个状态(就 ...
- ZooKeeper的三种典型应用场景
引言 ZooKeeper是中典型的pub/sub模式的分布式数据管理与协调框架,开发人员可以使用它进行分布式数据的发布与订阅.另外,其丰富的数据节点类型可以交叉使用,配合Watcher事件通知机制,可 ...
- Python进阶-XVIV 类的内置方法:__str__ 、__repr__、析构函数(__del__)、双下的call,eq,new,hash 以及item相关的三个方法
类的内置方法 它与内置函数有紧密的联系,有的内置函数就是调用的内置方法. 在顶级父类obj中有: 两个双下方法 obj.__str__ str(obj) obj.__repr__ repr(obj) ...
- 【后台管理系统】—— Ant Design Pro 页面相关(三)
一.卡片Card分类 与普通卡片使用区别:底部按钮及内容样式 <Card hoverable bodyStyle={{ paddingBottom: 20 }} actions={[ // 卡片 ...
- redis相关笔记(三.redis设计与实现(笔记))
redis笔记一 redis笔记二 redis笔记三 1.数据结构 1.1.简单动态字符串: 其属性有int len:长度,int free:空闲长度,char[] bur:字符数组(内容) 获取字符 ...
- RabbitMQ原理与相关操作(三)消息持久化
现在聊一下RabbitMQ消息持久化: 问题及方案描述 1.当有多个消费者同时收取消息,且每个消费者在接收消息的同时,还要处理其它的事情,且会消耗很长的时间.在此过程中可能会出现一些意外,比如消息接收 ...
- event相关
event.button 事件属性可返回一个整数,指示当事件被触发时哪个鼠标按键被点击. event.keyCode 事件属性可返回一个整数,指示当事件被触发时哪个键盘按键被点击. <scri ...
- 从0开始学Java——JSP和Servlet——jsp转servlet出错的三个典型场景
由于jsp终究是要转换为servlet的java文件,然后再编译为.class文件,最后才执行,那么在这过程的任何一个步骤都可能有问题,主要包括三个方面,下面逐一分析: 一.JSP转换为Servlet ...
- QPainter就是手里的作图工具,只需要三洋东西:笔(颜色,宽度,样式),字体(写字),刷子(大面积作画),这里有三个典型例子
设置笔和字体以后,就可以写字了: void MainWindow::paintEvent(QPaintEvent *event) { Q_UNUSED(event); QPainter painter ...
- 浅析DES与AES、RSA三种典型加密算法的比较
DES与AES的比较 自DES 算法公诸于世以来,学术界围绕它的安全性等方面进行了研究并展开了激烈的争论.在技术上,对DES的批评主要集中在以下几个方面: 1.作为分组密码,DES 的加密单位仅有64 ...
随机推荐
- rust字节数组转换为string
一.String::from_utf8 fn main() { let bytes = vec![0x41, 0x42, 0x43]; let s = String::from_utf8(bytes) ...
- .net基础—委托和事件
委托 委托是一种引用类型,表示对具有特定参数列表和返回类型的方法的引用. 在实例化委托时,可以将其实例与任何具有兼容签名和返回类型的方法相关联. 可以通过委托实例调用方法.可以将任何可访问类或结构中与 ...
- js时间转化为几天前,几小时前,几分钟前
在前面一篇文章中,我们学习到了如何获取时间和怎么算出两者之间的时间差 今天看看怎么将时间戳转换为几个月前,几周前,几天前,几分钟前的形式.与上面类似通过JavaScript计算当前时间与定义的时间的对 ...
- [BOM]打包代码前,快速去除前端日志
一般开发时使用console.log() 方法.于是可以在js文件的最开头加上: console.log = function(){}
- 058_Component Bundles
- TypeScript 合并以及删除数组数据
1.添加 concat() 2.删除(替换) splice() array.splice(index,int,any) index 是 array数组起始位置的index(从0开始) int是操作从i ...
- ping 请求找不到主机 www.baidu.com
1.以管理员方式运行cmd 2.输入netsh winsock reset 3.重启电脑 4.如果还是不行,就删除C:\Windows\System32\drivers\etc里面的hosts文件试试 ...
- 删除没有刀路的刀具.txt
1 UF_initialize(); 2 std::vector<tag_t>tool_tag; 3 std::vector<tag_t>del_tag; 4 tag_t ...
- 使用signalr不使用连接服务器和前台的js的方法
1:使用这种方式,,就不需要前后台链接的js 2:新建一个empty的MVC项目 3:新建一个controller和index.html 4: 新建一个signalr 集线器类名为PersonHub, ...
- ADC参悟
SFDR比信噪比大15dB,怎么跟应用联系起来,分别决定了啥?