什么是委托?委托就是持有一个或多个方法的对象,并且该对象可以执行,可以传递。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace ConsoleApplication1
{
class Program
{
// 定义委托事件
delegate void ActCute();
static void Main(string[] args)
{
ActCute del = null;
Dog dog1 = new Dog("dog");
Cat cat1 = new Cat("cat");
// 委托事件的添加
del = dog1.WagTail;
del += cat1.InnocentLook;
// 定义lambda 表达式
del += () =>
{
Console.WriteLine("这是lambda表达式定义的方法!!!");
};
// 按照添加的顺序依次调用
del();
}
public class Dog
{
private string Name;
public Dog(string name)
{
Name = name;
}
public void WagTail()
{
Console.WriteLine(Name + "正在摇尾巴...");
}
}
public class Cat
{
private string Name;
public Cat(string name)
{
Name = name;
}
public void InnocentLook()
{
Console.WriteLine(Name + "正在摆弄无辜表情...");
}
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace ConsoleApplication2
{
class Program
{
delegate void Func1();
// 使用方法
public static void Aminal()
{
Console.WriteLine("我是一只动物...");
}
public static void Plant()
{
Console.WriteLine("我是一棵植物...");
}
static void Main(string[] args)
{
Func1 myfunc1;
myfunc1 = new Func1(Aminal);
myfunc1 += new Func1(Plant);
myfunc1(); }
}
}

委托是一个类型,事件是委托的一个特殊实例。

定义一个委托实例是不完全的,可以被外部的类调用内部的委托;事件可以在外部定义,但是触发事件是在内部。所以相对于普通的委托,事件是安全的。

事件:一种封装受限制的委托。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
Client1 c1 = new Client1();
Client1 c2 = new Client1();
// 绑定委托
Dog.NewDog += c1.WangADog;
Dog.NewDog += c2.WangADog;
Dog dog1 = new Dog("jack");
}
public class Dog
{
private string Name;
public delegate void Handler(); // 定义委托类型
public static event Handler NewDog; // 在委托事情上定义事件
public Dog(string name)
{
Name = name;
if (NewDog != null)
{
NewDog();
}
}
public void WagTail()
{
Console.WriteLine(Name + "正在摇尾巴...");
}
}
class Client1
{
public void WangADog()
{
Console.WriteLine("我想要一条狗!!!");
}
}
}
}

2019-7-29

委托和事件在窗体之间的应用:

委托:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms; namespace 窗体之间的传参
{
public partial class ParentForm : Form
{
public Action<string> ChildFrm { get; set; } // 定义一个委托
public ParentForm()
{
InitializeComponent();
} private void ParentForm_Load(object sender, EventArgs e)
{
ChildForm frm = new ChildForm(); // 初始化子窗体
ChildFrm += frm.SetText; // 绑定事件
frm.Show();
} private void Btn_Send_Click(object sender, EventArgs e)
{
ChildFrm(this.TB_Msg.Text);
}
}
}
======================================================
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms; namespace 窗体之间的传参
{
public partial class ChildForm : Form
{
public ChildForm()
{
InitializeComponent();
} private void ChildForm_Load(object sender, EventArgs e)
{ }
public void SetText(string text)
{
this.TB_Msg.Text = text;
}
}
}

事件:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms; namespace 窗体之间的传参
{
public partial class ParentForm : Form
{
public event EventHandler ChildFrmEvent; // 定义一个事件
public ParentForm()
{
InitializeComponent();
} private void ParentForm_Load(object sender, EventArgs e)
{
ChildForm frm = new ChildForm(); // 初始化子窗体
ChildFrmEvent += frm.FrmEvent; // 绑定子窗体里面的事件
frm.Show(); // 显示
} private void Btn_Send_Click(object sender, EventArgs e)
{
ChildFrmEvent(this, new NewEventArgsClass() { Text = this.TB_Msg.Text });
}
}
}
===================================================================
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms; namespace 窗体之间的传参
{
public partial class ChildForm : Form
{
public ChildForm()
{
InitializeComponent();
} private void ChildForm_Load(object sender, EventArgs e)
{
}
public void FrmEvent(object sender, EventArgs e)
{
NewEventArgsClass args = e as NewEventArgsClass;
TB_Msg.Text = args.Text;
}
}
}
===================================================================================================

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks

namespace 窗体之间的传参
{
  class NewEventArgsClass:EventArgs
  {
    public string Text { get; set; }
  }
}

 

 管家解耦父子窗体(发布订阅模式的非委托实现)

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms; namespace 管家解耦父子窗体
{
public partial class MasterForm : Form
{
public MasterForm()
{
InitializeComponent();
} private void MasterForm_Load(object sender, EventArgs e)
{
// 启动父子窗体
ParentForm PFrm = new ParentForm();
ChildForm CFrm = new ChildForm();
PFrm.ChildList = new List<TotalInterface>();
PFrm.ChildList.Add(CFrm);
PFrm.Show();
CFrm.Show();
}
}
}
=======================================================================
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms; namespace 管家解耦父子窗体
{
public partial class ParentForm : Form
{
public List<TotalInterface> ChildList { get; set; }
public ParentForm()
{
InitializeComponent();
} private void ParentForm_Load(object sender, EventArgs e)
{ } private void Btn_Send_Click(object sender, EventArgs e)
{
if (ChildList == null) return;
foreach(TotalInterface item in ChildList)
{
item.SetText(this.TB_Msg.Text);
}
}
}
}
=============================================================
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms; namespace 管家解耦父子窗体
{
public partial class ChildForm : Form,TotalInterface
{
public ChildForm()
{
InitializeComponent();
} public void SetText(string text)
{
this.TB_Msg.Text = text;
} private void ChildForm_Load(object sender, EventArgs e)
{ }
}
}
=============================================================
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace 管家解耦父子窗体
{
// 定义接口
public interface TotalInterface
{
void SetText(string text);
}
}

C# 委托、lambda表达式和事件的更多相关文章

  1. C#编程 委托 Lambda表达式和事件

    委托 如果我们要把方法当做参数来传递的话,就要用到委托.简单来说委托是一个类型,这个类型可以赋值一个方法的引用. 声明委托 在C#中使用一个类分两个阶段,首选定义这个类,告诉编译器这个类由什么字段和方 ...

  2. C#学习笔记三(委托·lambda表达式和事件,字符串和正则表达式,集合,特殊的集合)

    委托和事件的区别 序号 区别 委托 事件 1 是否可以使用=来赋值 是 否 2 是否可以在类外部进行调用 是 否 3 是否是一个类型 是 否,事件修饰的是一个对象 public delegate vo ...

  3. 委托、Lambda表达式、事件系列07,使用EventHandler委托

    谈到事件注册,EventHandler是最常用的. EventHandler是一个委托,接收2个形参.sender是指事件的发起者,e代表事件参数. □ 使用EventHandler实现猜拳游戏 使用 ...

  4. 委托、Lambda表达式、事件系列06,使用Action实现观察者模式,体验委托和事件的区别

    在"实现观察者模式(Observer Pattern)的2种方式"中,曾经通过接口的方式.委托与事件的方式实现过观察者模式.本篇体验使用Action实现此模式,并从中体验委托与事件 ...

  5. 委托、Lambda表达式、事件系列05,Action委托与闭包

    来看使用Action委托的一个实例: static void Main(string[] args) { int i = 0; Action a = () => i++; a(); a(); C ...

  6. 委托、Lambda表达式、事件系列04,委托链是怎样形成的, 多播委托, 调用委托链方法,委托链异常处理

    委托是多播委托,我们可以通过"+="把多个方法赋给委托变量,这样就形成了一个委托链.本篇的话题包括:委托链是怎样形成的,如何调用委托链方法,以及委托链异常处理. □ 调用返回类型为 ...

  7. 委托、Lambda表达式、事件系列03,从委托到Lamda表达式

    在"委托.Lambda表达式.事件系列02,什么时候该用委托"一文中,使用委托让代码简洁了不少. namespace ConsoleApplication2 { internal ...

  8. 委托、Lambda表达式、事件系列02,什么时候该用委托

    假设要找出整型集合中小于5的数. static void Main(string[] args) { IEnumerable<int> source = new List<int&g ...

  9. 委托、Lambda表达式、事件系列01,委托是什么,委托的基本用法,委托的Method和Target属性

    委托是一个类. namespace ConsoleApplication1 { internal delegate void MyDelegate(int val); class Program { ...

  10. C#高级编程(第9版) 第08章 委托、lambda表达式和事件 笔记

          本章代码分为以下几个主要的示例文件: 1. 简单委托 2. 冒泡排序 3. lambda表达式 4. 事件示例 5. 弱事件     引用方法 委托是寻址方法的.NET版本.在C++中函数 ...

随机推荐

  1. MySQL:存储过程和函数

    存储过程和函数 一.创建存储过程和函数 1.创建存储过程 语法: CREATE PROCEDURE sp_name ([proc_parameter[,...]]) [characteristic . ...

  2. ios轮播图片用法

    // // ZQRViewController.m // 04-图片轮播器 // // Created by apple on 17-08-24. // Copyright (c) 2017年 zzq ...

  3. 移动端与PC端的触屏事件

    由于移动端是触摸事件,所以要用到H5的属性touchstart/touchmove/touched,但是PC端只支持鼠标事件,所以此时可以这样转换 var touchEvents = { touchs ...

  4. Spring、Commons的BeanUtils.copyProperties用法

    如果两个对象A.B的大部分属性的名字都一样,此时想将A的属性值复制给B,一个一个属性GET\SET代码量太大,可以通过复制属性的方式减小工作量,同时代码看起来更加简洁明了,复制属性可以用Spring或 ...

  5. KB/MB/GB。。单位换算

    今天遇到一个需求,需要把数据单位进行换算,记录一下.写的不好请勿见怪. function bytesToSize( bytes ) {//单位转化         var k = 1024,      ...

  6. 神州数码RIP路由协议

    实验要求:熟练掌握RIP配置方法 拓扑如下 R1 enable 进入特权模式 config 进入全局模式 hostname R1 修改名称 interface s0/1 进入端口 physical-l ...

  7. PHP实现二叉树的深度优先遍历(前序、中序、后序)和广度优先遍历(层次)

    前言: 深度优先遍历:对每一个可能的分支路径深入到不能再深入为止,而且每个结点只能访问一次.要特别注意的是,二叉树的深度优先遍历比较特殊,可以细分为先序遍历.中序遍历.后序遍历.具体说明如下: 前序遍 ...

  8. Android Native Hook技术(二)

    Hook技术应用 已经介绍了安卓 Native hook 原理,这里介绍 hook 技术的应用,及 Cyida Substrate 框架. 分析某APP,发现其POST请求数据经过加密,我们希望还原其 ...

  9. Quorum算法

    分布式系统中,一般保存多个数据副本,明显可以提高系统可靠性.并且存储这些数据副本的节点,不仅做容灾用,也可以提供服务,作负载均衡. 这里就涉及到一个数据一致性的问题,也就是各副本间要进行同步,来保持最 ...

  10. 爬取贴吧中的html,并保存到相对应的文件夹中

    功能:输入要爬取的贴吧名称,起始页和终止页即可. # -*- coding: utf-8 -*- import urllib.request import urllib.parse import os ...