将方法作为方法的参数

委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递,这种将方法动态地赋给参数的做法,可以避免在程序中大量使用If-Else(Switch)语句,同时使得程序具有更好的可扩展性。

将方法绑定到委托

第一次用的“=”,是赋值的语法;第二次,用的是“+=”,是绑定的语法。如果第一次就使用“+=”,将出现“使用了未赋值的局部变量”的编译错误。

既然给委托可以绑定一个方法,那么也应该有办法取消对方法的绑定,很容易想到,这个语法是“-=”:

使用委托可以将多个方法绑定到同一个委托变量,当调用此变量时(这里用“调用”这个词,是因为此变量代表一个方法),可以依次调用所有绑定的方法。

下面是一个委托, 匿名函数, lambda表达式的示例

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace DennisDemos.DemosHelper
{
//定义了一个从System.Delegate类派生的类
//也可以理解为一种数据类型 这种数据类型指向返回值为void 参数为Person对象的函数
//我们也可以把Person类理解为一种数据类型 只是它包含的是Name和Age
public delegate void EatFoodDelegate(Person p); public class Person
{ public string Name { get; set; } public int Age { get; set; } public Person(string name, int age)
{
Name = name;
Age = age;
} //既然委托是一数据类型和String一样,所以可以像声明String对象一样声明代理变量
public EatFoodDelegate eatFoodDelegate;
////之前是直接声明委托,现在是声明一个事件
//public event EatFoodDelegate EatFoodEventHandler; public void eating()
{ if (eatFoodDelegate != null)
{
eatFoodDelegate(this);
}
} }
}

Person 类

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using DennisDemos.DemosHelper; namespace DennisDemos.Demos
{
public class DelegateDemo
{
/// <summary>
/// chineseEat 实际上是一个独立的方法, 需要和委托变量关联起来, 但是程序运行过程中, chineseEat实际上只被调用了一次.
/// 对于程序比较复杂的代码来说, 这种情况会使得代码的结构比较混乱, 而且可读性比较差.
/// 因此对于那种在程序运行中只调用一次的委托方法, 建议使用 匿名方法的方式去调用.
/// 匿名方法 , 顾名思义就是说方法没有名字. 所以这种匿名方法必须在定义的时候进行调用. 并没有重用性.
/// </summary>
public void Run()
{
Person chinesePerson = new Person("小明", 25);
//普通委托示例
chinesePerson.eatFoodDelegate += new EatFoodDelegate(chineseEat); // += 将方法注册到委托当中.
chinesePerson.eating(); Console.WriteLine("--------------------------------------"); //使用匿名函数示例
EatFoodDelegate EnglishEatPisaDelegate = delegate (Person p)
{
Console.WriteLine("I'm {0},I am {1} , I eat PiSa", p.Name, p.Age);
}; Person englishPerson = new Person("Ivan", 25);
englishPerson.eatFoodDelegate = delegate (Person p)
{
Console.WriteLine("I'm {0},I am {1} , I eat MianBao", p.Name, p.Age);
};
englishPerson.eatFoodDelegate += EnglishEatPisaDelegate;
englishPerson.eating(); Console.WriteLine("--------------------------------------"); //lambda示例
Person lambdaPerson = new Person("lambda", 25);
lambdaPerson.eatFoodDelegate = (Person p) => {
Console.WriteLine("I'm {0},I am {1} , I eat MianBao1", p.Name, p.Age);
};
lambdaPerson.eatFoodDelegate += (Person p) => {
Console.WriteLine("I'm {0},I am {1} , I eat PiSa1", p.Name, p.Age);
};
lambdaPerson.eating();
Console.ReadLine();
}
static void chineseEat(Person p)
{
Console.WriteLine("我是{0},我今年{1}岁了,我吃馒头", p.Name, p.Age);
}
}
}

DelegateDemo

【C#】委托中的匿名函数与lambda的更多相关文章

  1. [C#学习教程-委托]001.大道至简之委托(代理),匿名函数,Lambda表达式

    引言:此文翻译自CodeProject上的同名文章<C# Delegates,Anonymous Methods, and Lambda Expressions>,在此一起Mark一下,此 ...

  2. c#委托中的匿名方法和lambda表达式

    一.一般委托方式 Func<int, int, int> AddMethodHander; public unName() { AddMethodHander += AddMethod; ...

  3. 3 委托、匿名函数、lambda表达式

    委托.匿名函数.lambda表达式 在 2.0 之前的 C# 版本中,声明委托的唯一方法是使用命名方法.C# 2.0 引入了匿名方法,而在 C# 3.0 及更高版本中,Lambda 表达式取代了匿名方 ...

  4. 基础拾遗---委托,匿名函数,lambda

    前言: C# 中的委托(Delegate)类似于 C 或 C++ 中函数的指针.委托是存有对某个方法的引用的一种引用类型变量.引用可在运行时被改变.委托(Delegate)特别用于实现事件和回调方法. ...

  5. 用委托、匿名函数、Lambda的方式输出符合要求的数

    最近看了一些博客,对委托和匿名函数和Lambda的方式有了一些更深的理解,在前人的基础上.我也写3个例子 using System; using System.Collections.Generic; ...

  6. 匿名函数:Lambda表达式和匿名方法

    匿名函数一个"内联"语句或表达式,可在需要委托类型的任何地方使用.可以使用匿名函数来初始化命名委托,或传递命名委托(而不是命名委托类型)作为方法参数. 共有两种匿名函数: Lamb ...

  7. C#语法之匿名函数和Lambda表达式

    上一篇博客主要是对委托和事件做了一小结,这篇是在上一篇博客的基础上对匿名函数和Lambda表达式小结.还是接着上一篇说起,在上一篇中也说了委托是一种数据结构,主要是解决让函数作为参数的问题.在使用委托 ...

  8. 浅析匿名函数、lambda表达式、闭包(closure)区别与作用

    浅析匿名函数.lambda表达式.闭包(closure)区别与作用 所有的主流编程语言都对函数式编程有支持,比如c++11.python和java中有lambda表达式.lua和JavaScript中 ...

  9. python基础----内置函数----匿名函数(lambda)

    Python3版本所有的内置函数: 1. abs() 获取绝对值 >>> abs(-) >>> abs() >>> abs() >>& ...

随机推荐

  1. 取n到m行

    取n到m行 . select top m * from tablename where id not in (select top n id from tablename order by id as ...

  2. 基础 MySQL

    .一.MySQL概述 1.什么是数据库  答:数据的仓库,如:在ATM的示例中我们创建了一个 DB 目录,称其为数据库 2.什么是 MySQL.Oracle.SQLite.Access.MS SQL ...

  3. python 类似java的三目运算符

    python中没有其他语言中的三元表达式,不过有类似的实现方法 其他语言中,例如java的三元表达式是这样 int a = 1; String b = ""; b = a > ...

  4. scrapy框架 + selenium 爬取豆瓣电影top250......

    废话不说,直接上代码..... 目录结构 items.py import scrapy class DoubanCrawlerItem(scrapy.Item): # 电影名称 movieName = ...

  5. 吴恩达深度学习笔记(deeplearning.ai)之卷积神经网络(CNN)(上)

    作者:szx_spark 1. Padding 在卷积操作中,过滤器(又称核)的大小通常为奇数,如3x3,5x5.这样的好处有两点: 在特征图(二维卷积)中就会存在一个中心像素点.有一个中心像素点会十 ...

  6. javamail邮件Multipart支持同时发text和html混合消息,alternative纯文本与超文本共存

    javamail邮件Multipart支持同时发text和html混合消息alternative纯文本与超文本共存 multipart/mixed:附件. multipart/related:内嵌资源 ...

  7. Linux环境nginx的安装

    安装Nginx前需要编译环境和库文件支持: 1.安装make: yum -y install openssl openssl-devel yum -y install gcc automake aut ...

  8. 余额表前后台操作和对应sql

    发生额的含义:产生于账行表. gl_je_lines账行表——>借贷(会产生额度,即发生额) —————————————————————————— gl_balances余额表: 余额   =  ...

  9. mysql 查看当前使用的配置文件my.cnf的方法(推荐)

    my.cnf是mysql启动时加载的配置文件,一般会放在mysql的安装目录中,用户也可以放在其他目录加载. 安装mysql后,系统中会有多个my.cnf文件,有些是用于测试的. 使用locate m ...

  10. 禁止单个IP或ip段访问

    //IP禁止判断接口,返回true则为找到 function checkIp($ip, $ipbanned) { $ipbannedFlag = false; if (!empty($ipbanned ...