C#是跟着杨老师的教程走的,在这里感谢一下老师的无私奉献,他的cnblog地址:>cgzl,他的B站地址:>solenovex

进入正题:

  Delegate表示委托,委托是一种数据结构,它引用静态方法或引用类实例及该类的实例方法。(引用官方文档的英文原话)

  Represents a delegate, which is a data structure that refers to a static method or to a class instance and an instance method of that class.

  看不懂没关系,我也看不懂,哈哈哈。

  直接拿两个例子看一下,第一个是杨老师提供的。

  

 using System;

 namespace Demo
{
class Program
{
// 定义一个名为Transformer的delegate类,参数类型int,返回类型int。
delegate int Transformer(int x);
// 定义一个静态类Square,这里用了Lambda表达式,同样的,参数类型为int,返回类型也是int。
static int Square(int x) => x * x;
static void Main(string[] args)
{
Transformer t = Square; //把Square方法当作变量传入委托变量t,这时创建了委托实例。
int result = t(); // 调用委托方法。
Console.WriteLine(result); // 输出结果:9
}
}
}

这里的 Transformer t= Square; 简写了,等效于Transformer t= new Transformer(Square);

也就是当调用t(3)(委托实例)时,先调用了委托,委托再去调用目标方法。画个图应该很好理解。

优点:解耦。

应用:编写插件式的方法

  ·方法是在运行时才赋值给委托变量的

  

 using System;

 namespace Demo
{
public delegate int Transformer(int x); // 定义委托类要注意传入的类型和返回类型。 class Util
{
public static void Transform(int[] values, Transformer t)
{
for (int i = ; i < values.Length; i++)
{
values[i] = t(values[i]); // 委托实例t
}
}
}
class Program
{
static int Square(int x) => x * x;
public static void Main(string[] args)
{
int[] values = { , , };
Util.Transform(values, Square); // 这里调用Util的静态方法Transform,并传入参数。目标函数为Square
foreach (int i in values)
{
Console.WriteLine(i);
}
}
}
}

接下来看一下官方文档给的例子:>Delegate

 using System;

 namespace Demo
{
public delegate String myMethodDelegate(int myInt); public class mySampleClass
{
public String myStringMethod(int myInt)
{
if (myInt>)
{
return ("positive");
}
if (myInt<)
{
return ("negative");
}
return ("zero");
}
public static String mySignMethod(int myInt)
{
if (myInt > )
{
return ("+");
}
if (myInt < )
{
return ("-");
}
return ("");
}
} class Program
{
public static void Main(string[] args)
{
// Creates one delegate for each method. For the instance method, an
// instance (mySC) must be supplied. For the static method, use the
// class name.
mySampleClass mySC = new mySampleClass();
myMethodDelegate myD1 = new myMethodDelegate(mySC.myStringMethod);
myMethodDelegate myD2 = new myMethodDelegate(mySampleClass.mySignMethod); // Invokes the delegates.
Console.WriteLine("{0} is {1}; use the sign \"{2}\".", , myD1(), myD2());
Console.WriteLine("{0} is {1}; use the sign \"{2}\".", -, myD1(-), myD2(-));
Console.WriteLine("{0} is {1}; use the sign \"{2}\".", , myD1(), myD2());
}
}
}

运行结果:

画个图分析一下:

多播委托

  委托按着我自己的理解就是把别人的方法放到我这儿,要用的时候去拿,但是不是在我这儿拿,而是到别人那去。em

   多播委托就是可以利用操作符+,-来创建新的委托实例,并赋值给当前的委托变量。

   

using System;

namespace Demo
{
public delegate int Transformer(int x);
class Program
{
static int Square(int x)
{
var result = x * x;
Console.WriteLine(result);
return result;
}
static int Cube(int x)
{
var result = x * x * x;
Console.WriteLine(result);
return result;
}
public static void Main(string[] args)
{
Transformer t = null;
t += Square;
t += Cube;
t();
}
}
}

输出结果:

Square在先,它就先执行。

假如都进行-=移除,最后会报空指针异常。

  委托实例里至少要有一个静态对象或者是实例对象,不然会抛出空指针异常。

A combining operation returns null when the result of the operation is a delegate that does not reference at least one method.

“委托是不可变的“

Combine 和Remove实际上是创建新的委托实例,并把它赋给当前的委托变量”。

感觉自己理解有不对的地方,就先这样吧。

【C#】学习笔记(1) Delegates,Events,Lambda Expressions的更多相关文章

  1. Python学习笔记010——匿名函数lambda

    1 语法 my_lambda = lambda arg1, arg2 : arg1 + arg2 + 1 arg1.arg2:参数 arg1 + arg2 + 1 :表达式 2 描述 匿名函数不需要r ...

  2. Java8学习笔记(一)--Lambda表达式

    两个概念 函数式接口 函数式接口就是只显式声明一个抽象方法的接口.为保证方法数量不多不少,java8提供了一个专用注解@FunctionalInterface,这样,当接口中声明的抽象方法多于或少于一 ...

  3. c++学习笔记(七)- lambda表达式 迭代器 算法

    关于lambda表达式: 刷题的时候遇到一句代码不懂: char ch = *it;auto it2 = find_if(it, b.end(), [ch](char x){ return x != ...

  4. Haskell语言学习笔记(79)lambda演算

    lambda演算 根据维基百科,lambda演算(英语:lambda calculus,λ-calculus)是一套从数学逻辑中发展,以变量绑定和替换的规则,来研究函数如何抽象化定义.函数如何被应用以 ...

  5. LINQ学习笔记——(2)Lambda表达式

    最基本的 Lambda 表达式语法: (参数列表)=>{方法体} 说明:   参数列表中的参数类型可以是明确类型或者是推断类型   如果是推断类型,则参数的数据类型将由编译器根据上下文自动推断出 ...

  6. 【C#】学习笔记(3) 关于Events使用的小Demo

    关于Events事件的简单Demo. 目录结构: Program.cs using System; namespace EventsDemo { class Program { static void ...

  7. Java8 学习笔记--函数式接口与lambda表达式的关系

    在java中,lambda表达式与函数式接口是不可分割的,都是结合起来使用的. 对于函数式接口,我们可以理解为只有一个抽象方法的接口,除此之外它和别的接口相比并没有什么特殊的地方.为了确保函数式接口的 ...

  8. STM32F103X datasheet学习笔记---Interrupts and events

    1.前言 本章主要介绍STM32中断和事件相关的内容 2.NVIC NVIC管理着包括内核异常等中断 主要特性 68个外部中断源(不包含16个内部中断线) 可编程优先级为16级 低延迟异常和中断处理 ...

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

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

随机推荐

  1. Java题库——Chapter5 方法

    1)Suppose your method does not return any value, which of the following keywords can be used as a re ...

  2. 前端之HTML介绍及使用

    一.HTML介绍 1.1 web本质 在pycharm写入一下代码,然后在浏览器地址栏输入地址和端口127.0.0.1:8080,回车,回来运行代码,直接访问客户端发送的内容conn.send(b'& ...

  3. 清新淡雅教育教学工作课件PPT模板

    模板来源:http://ppt.dede58.com/jiaoxuekejian/26240.html

  4. 手把手教你避开组件cover-view的那些坑

    腾讯位置服务基于微信提供的小程序插件能力,专注于(围绕)地图功能,打造一系列小程序插件,可以帮助开发者简单.快速的构建小程序,是您实现地图功能的最佳伙伴.目前微信小程序插件提供路线规划.地铁图.地图选 ...

  5. 剑指offer 28:字符串的排列

    题目描述 输入一个字符串,按字典序打印出该字符串中字符的所有排列.例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba. 输入描述 输入 ...

  6. EChart绘制风速风向曲线分析图

    1.获取ECharts 在 ECharts 的 GitHub 上下载最新的 release 版本,解压出来的文件夹里的 dist 目录里可以找到最新版本的 echarts 库. 2.引入ECharts ...

  7. fastadmin中js是如何调用的

    想要了解fastadmin中的js是怎么调用的,就应该先了解RequireJs. RequireJs是模块化工具,每一个我们自己的js文件或者库都可以看成是一个模块,按需引入.写法如下: <sc ...

  8. Create an op on tensorflow; 在tensorflow 1.7/2.0 中创建一个 Op操作

    最近项目,需要创建一个 tensorflow 的一个自定义操作,用来加速tensorflow的处理效果:下面对创建过程中,遇到的问题和资源进行简要记录,进行备忘: OP 创建 参考链接: https: ...

  9. 程序运行时间测试 - 使用libc 中 time 函数 实现秒级的运行时间检测

    c 标准库中,有time 函数,可以返回 1970年1月1日 开始到现在的秒数,我们可以调用两次的时间差来计算程序运行时间: https://github.com/yaowenxu/Workplace ...

  10. docker 私有registry harbor安装

    一,harbor安装: 参考:Installation and Configuration Guide 1,安装docker 2,安装docker compose sudo curl -L " ...