委托再学习

本文转载自深山老林

1.什么是委托?

委托是一种定义方法签名的类型,可以与具有兼容签名的任何方法关联。

2.委托有什么特点?

  • 委托类似于 C++ 函数指针,但它们是类型安全的。

  • 委托允许将方法作为参数进行传递。

  • 委托可用于定义回调方法。

  • 委托可以链接在一起;例如,可以对一个事件调用多个方法。

  • 方法不必与委托签名完全匹配。

  • C# 2.0 版引入了匿名方法的概念,此类方法允许将代码块作为参数传递,以代替单独定义的方法。

  • C# 3.0 引入了 Lambda 表达式,利用它们可以更简练地编写内联代码块。匿名方法和 Lambda
    表达式(在某些上下文中)都可编译为委托类型。这些功能统称为匿名函数。

3.如何使用委托?

Demo:

using System;

namespace ConsoleApplication28
{
class Program
{
public static void FunctionA(string strMessage)
{
Console.WriteLine(strMessage);
}

public delegate void DelegateMethod(string strMessage);

static void Main(string[] args)
{
DelegateMethod handler = FunctionA;
handler("Hello Kevin");
}

}
}


4.匿名方法

在 2.0 之前的 C# 版本中,声明委托的唯一方法是使用命名方法。C# 2.0
引入了匿名方法,通过使用匿名方法,由于您不必创建单独的方法,因此减少了实例化委托所需的编码系统开销。以下是两个使用匿名方法的示例:

Demo1:

using System;
using System.Windows.Forms;

namespace WindowsFormsApplication10
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
button1.Click += delegate(object sender, EventArgs e)
{
MessageBox.Show("The box is click");
};
}

private void Form1_Load(object sender, EventArgs e)
{

}
}
}


Demo2:

void StartThread()
{
Thread t1 = new Thread
(delegate()
{
MessageBox.Show("Hello,");
MessageBox.Show("Kevin");
});
t1.Start();
}

5.合并委托(多路广播委托)

Demo:

using System;

namespace ConsoleApplication29
{
delegate void DelegageMethod();
class Program
{
static void A()
{
Console.WriteLine("A");
}

static void B()
{
Console.WriteLine("B");
}

static void Main(string[] args)
{
DelegageMethod a, b, c, d;
a = A;
b = B;
c = a + b;
d = c - a;
Console.WriteLine("Invoking delegate a:");
a();
Console.WriteLine("Invoking delegate b:");
b();
Console.WriteLine("Invoking delegate c:");
c();
Console.WriteLine("Invoking delegate d:");
d();
}
}
}


时间: 2024-10-05 05:18:09

委托再学习的相关文章

JDBC再学习

JDBC是规范,地球人都知道. 啥是规范呢?反正我说不好,真要让我说的话,就是SUN制订了一大堆接口,然后你要是想实现一些功能就要去实现这些接口,他要是也想要实现这些功能也得去老实儿的实现这些接口. JDBC就是这些接口们,java.sql包下面有好多个接口文件,这些接口文件就是所谓的规范,标准. 无论Oracle,MySql,还是DB2,SqlServer都实现了这些接口.这样一来我们只需要针对着jdk中的接口编程就可以了. 记得上学的时候,最讨厌的就是JDBC,因为就这里需要记一大串东西,第

Java泛型再学习

泛型是对于数据的一种规范,他限定了类.容器.方法可以接受的参数类型,避免参数类型混乱. 一.基本泛型 泛型最常见的地方就是集合,如: -- ArrayList<String>  表示这个集合中只能存放String类型的元素 -- HashMap<String, Object>  表示这个图中只能存放键为String类型,值为Object类型的元素 特别要注意的时,泛型只存在于编译阶段,在程序运行阶段,我们定义的泛型是并不存在的,这种方案叫“擦除”,示例: 1 public clas

Java注解再学习

注解就是一个标识符,用来标识身份.处理规则等.注解是出现可以代替XML配置文件,使程序更加清晰明了.注解也是框架配置的发展方向,对于Spring而言,虽然有人反对使用注解对Spring进行配置,说这是违背了Spring的IoC的理念,其实不然.使用注解将Java类注解为配置文件和使用XML是一样的,还可以减少配置文件,并且更加自由化的定义bean的初始化过程. 注解是一门比较简单却很实用的技术,定义注解使用@interface关键字: 1 public @interface MyAnnotati

恶补java(十)---泛型与集合的再学习

其余的就不多说了,一切都在代码中 package com.gc.generic; /** * JDK5 之前集合对象使用问题: * 1.向集合添加任何类型对象 * 2.从集合取出对象时,数据类型丢失,使用与类型相关方法,强制类型转换 * 存在安全隐患 * * ***************************** * * JDK5中的泛型:允许程序员使用泛型技术限制集合的处理类型 * List<String> list=new ArrayList<String>(); * 从而

Java反射再学习

在最初学习Java的时候觉得反射真的好难,并不是技术负责,而是思想复杂,无法接受.随着工作经验的增多,今日偶然间又看见某智的一个视频,感觉茅塞顿开.顺便在此系统整理一下反射的知识. 一言以蔽之:反射就是将Java类的各个组成部分转换为对应的Java对象. 我们知道,一切皆对象,那么这个“一切”必然也包含了Java类啊,Java类也是一种事物,那么他是什么的对象呢?毫无疑问,Java类是Class类的对象.(PS:那么Class类又是谁的对象呢?求大神指教?这问题貌似无穷无尽啊 %>_<% )

UNIX再学习 -- 文件I/O

在 UNIX/Linux 系统中,一切皆文件,这句话想必都有听过.对于文件的操作几乎适用于所有的设备,这也就看出了文件操作的重要性了.在C语言再学习部分有讲过标准I/O文件操作,参看:C语言再学习 -- 文件 下面我们来讲解下系统文件I/O的. 一.文件描述符 1.文件描述符简介 首先从文件描述符开始讲起.因为,对于内核而言,所有打开的文件都是通过文件描述符引用的.那么文件描述符到底是什么? 文件描述符(file descriptor)通常是一个小的非负整数,内核用以标识一个特定进程正在访问的文

【C语言学习】指针再学习(二)之数组的指针

★一维数组 一个整型数据为4个字节.4个字节就是32位,即可以表示2^32个数字 在程序中定义一个数组a[5] = {1,2,3,4,5}; 那么a[0]的地址就是0x00000000,数组名a是数组首元素的地址,a的地址也是0x00000000.a+1则表示的地址是0x00000004,而不是0x00000001.因为1这个值,根据前面的指针a所指向的类型的长度来调整自己的长度.也就是说如果a是指向整型的指针,那么后面加的1也表示4个字节,如果a是指向字符型的指针,那么后面加的1表示1个字节.

PHP再学习5——RESTFul框架 远程控制LED

0.前言 去年(2013年)2月第一次接触yeelink平台,当时该平台已经运行了一些时间也吸引了不少极客.试想自己也将投身IoT(物联网)行业,就花了些时间研究了它.陆陆续续使用和研究了一年,大致围绕两个问题展开——1.yeelink平台如何使用,2.如何构造一个功能简单些的yeelink平台.    [PHP学习笔记——索引博文] 本文将讨论如何构造一个简单restful架构平台(该平台有点像yeelink,不过功能比yeelink少的多),并结合树莓派实现LED的远程控制(网络控制).构建

express再学习

对比spring,django,再学习express就有很多共通的地方啦... 看的书是一本小书,<express in action>,排版比较好. 昨天开始看,看了快四分之一啦... 练习代码: var express = require("express"); var http = require("http"); var path = require("path"); var logger = require("mo