C#基础-委托与事件
委托
delegate是申明委托的关键字
返回类型都是相同的,并且参数类型个数都相同
委托声明
delegate double DelOperater(double num1, double num2);
实例化委托对象
class Program
{
static void Main(string[] args)
{
DelOperater delOp = new DelOperater(Add);
}
static double Add(double a,double b)
{
return a + b;
}
}
委托的调用
double r1 = delOp.Invoke(3, 5); // 第一种方法
double r2 = delOp(3, 5); // 第二种方法
委托增加指向方法
delOp += new DelOperater(Sub); // 减法被传递进来
委托去除指向方法
delOp -= new DelOperater(Sub); // 减法被移出去
案例:关于加减乘除的委托,它的返回值都是double类型,并且都有两个double的参数
namespace ConsoleApp7
{
// delegate是申明委托的关键字
// 关于加减乘除的委托,它的返回值都是double类型,并且都有两个double的参数
delegate double DelOperater(double num1, double num2);
class Program
{
static void Main(string[] args)
{
// 使用委托的时候需要实例化委托对象
// 在实例化委托时,会把方法名作为一个参数传进来,
DelOperater delOp = new DelOperater(Add);
// 在调用委托时,实际上调用的是委托指向的方法
double r1 = delOp.Invoke(3, 5);
Console.WriteLine("委托调用的方法的执行结果:" + r1);
double r2 = delOp(3, 5);
Console.WriteLine("委托调用的方法的执行结果:" + r2);
delOp += new DelOperater(Sub); // 减法被传递进来
double r3 = delOp.Invoke(3, 5);
Console.WriteLine("委托调用的方法的执行结果:" + r3);
double r4 = delOp(3, 5);
Console.WriteLine("委托调用的方法的执行结果:" + r4);
}
static double Add(double a,double b)
{
return a + b;
}
static double Sub(double a,double b)
{
return a - b;
}
}
}
事件
事件定义的方法
// 定义一个事件,就是委托的实例对象
public static event DelSendMsg sendEvent;
做一个案例:
需要写两个类。MoblieServer和MobileClient
手机服务器端
using System;
using System.Collections.Generic;
using System.Text;
namespace ConsoleApp7
{
// 手机服务器端
public delegate void DelSendMsg(string msg);
class MobileServer
{
// 定义一个事件,就是委托的实例对象
public static event DelSendMsg sendEvent;
// 将服务器推送到客户端方法
public void SendMsg(string msg)
{
Console.WriteLine("服务器给客户端手机发送消息");
// 如果客户端订阅了该事件
if (sendEvent != null)
{
sendEvent(msg);// 事件的执行,事件的执行实践上关联到具体事件绑定的方法的执行
}
}
}
}
手机客户端
using System;
using System.Collections.Generic;
using System.Text;
namespace ConsoleApp7
{
// 手机客户端
class MobileClient
{
// 客户端订阅服务器端推送消息功能
public void Dingyue()
{
Console.WriteLine("手机客户端已经订阅了服务端订阅消息");
MobileServer.sendEvent += new DelSendMsg(mobServer_sendEvent);
}
private void mobServer_sendEvent(string msg)
{
Console.WriteLine("这是客户端接收到服务器端推送的消息:"+msg);
}
}
}
主程序
class Program
{
static void Main(string[] args)
{
MobileServer moserver = new MobileServer();
MobileClient moclient = new MobileClient();
moclient.Dingyue();
moserver.SendMsg("今天天气晴朗");
}
}
效果如下:
C#基础-委托与事件的更多相关文章
- C# 基础 - 委托、事件
1. 委托 sequenceDiagram 方法->>委托: 返回值和入参一样 委托->>方法: 调用委托就是调用绑定的方法 delegate int NumTest(int ...
- .NET基础拾遗(4)委托、事件、反射与特性
Index : (1)类型语法.内存管理和垃圾回收基础 (2)面向对象的实现和异常的处理基础 (3)字符串.集合与流 (4)委托.事件.反射与特性 (5)多线程开发基础 (6)ADO.NET与数据库开 ...
- 【.NET基础】--委托、事件、线程(3)
之前的两篇文章我们了解了委托和事件,本文我们看一下线程. 1,一个窗体程序,默认拥有一个线程(相当于一个商店里面,只有一个店员),这个默认的线程叫做 UI线程/主线程. 2,进程和线程的关系: A,进 ...
- 转载 【.NET基础】--委托、事件、线程(3)
之前的两篇文章我们了解了委托和事件,本文我们看一下线程. 1,一个窗体程序,默认拥有一个线程(相当于一个商店里面,只有一个店员),这个默认的线程叫做 UI线程/主线程. 2,进程和线程的关系: A ...
- 转载 【.NET基础】--委托、事件、线程(2) https://www.cnblogs.com/chengzish/p/4569912.html
[.NET基础]--委托.事件.线程(2) 本文介绍event的使用以及原理,本文接上一篇文章的Demo继续[下载上一篇Demo] 上一篇我们在类(dg_SayHi.cs)里面定义代理了4个Del ...
- 转载 【.NET基础】--委托、事件、线程(1) https://www.cnblogs.com/chengzish/p/4559268.html
[.NET基础]--委托.事件.线程(1) 1,委托 是存放方法的指针的清单,也就是装方法的容器 A, 新建winform项目[01委托],项目中添加dg_SayHi.cs 委托类 用于存储方法 ...
- .NET零基础入门05:委托与事件
一:前言 本小节,我们需要停一停我们的小游戏开发,虽然它现在还不完美,还很简单,甚至还有BUG.但是,为了更好的理解C#,现在到了该深入了解一些基础知识的时候了. 当然,实际上,本小节内容对于零基础入 ...
- C#基础知识之事件和委托
本文中,我将通过两个范例由浅入深地讲述什么是委托.为什么要使用委托.委托的调用方式.事件的由来..Net Framework中的委托和事件.委托和事件对Observer设计模式的意义,对它们的中间代码 ...
- 【.NET基础】--委托、事件、线程(2)
本文介绍event的使用以及原理,本文接上一篇文章的Demo继续[下载上一篇Demo] 上一篇我们在类(dg_SayHi.cs)里面定义代理了4个Delegate,然后在Button的后台事件中 新建 ...
随机推荐
- ASP.NET那点不为人知的事(一)
http://www.cnblogs.com/OceanEyes/archive/2012/08/13/aspnetEssential-1.html#_label0 我们上网时,在浏览器地址输入网址: ...
- dll托管于非托管
托管的DLL组件可以在VS 直接添加引用,在使用using dll的文件命名空间就可以使用 非托管的DLL组件,只能通过using system.Runtime.InteropServices:引入 ...
- 权限修饰符(public、protected、default、private)权限验证
一.测试方法 在authorityTest包中建类AuthorityValidate package authorityTest; public class AuthorityValidate { p ...
- #include stdio.h(5)
#include <stdio.h> int main() { //1.数组的排序-冒泡排序 /* 1.规则:相邻的两个数据进行比较 2.如果有N个数据,需要选择N-1次参照物来比较, 因 ...
- APK加固之类抽取分析与修复
0x00 简单介绍 目前我己知的APK加固主要有以下两种方式(或有其它的方式有待发现) 隐藏dex文件:通过对目标DEX文件进行整体加密或压缩方式把整个dex转换为另外一个文件存放在assets文 ...
- Trouble Shooting的一些感想(实时补充)
最近一直做两个产品功能的Merge工作,代码Merge过来之后,发现了很多问题.经过Trouble Shooting,最终发现归根结底都是我们Merge的问题,例如有的Code没有Merge过来,Me ...
- python 修改xml文件
在百度知道里面有人问了这么一个问题: 有一个xml文件:<root>text <a/> <a/> ...这里省略n个<a/> <root>想 ...
- linux上传、下载文件rz、sz命令
1.介绍 sz命令是利用ZModem协议来从linux服务器传送文件到本地,一次可以传送一个或多个文件.相对应的从本地上传文件到Linux服务器,可以使用rz命令. 2.参数说明 -a,以文本方式传输 ...
- C#调用C++的dll存在的问题
C#调用C++写的DLL时,在C#程序中,使用DllImport定义C++导出函数的定义信息,之前在C++中定义导出函数时,使用了long作为参数类型,使用C#调用时,开始在64位版本是哪个测试,一切 ...
- April 29 2017 Week 17 Saturday
Every man is a poet when he is in love. 每个恋爱中的人都是诗人. It is said this saying was from Plato, the famo ...