首页 技术 正文
技术 2022年11月15日
0 收藏 512 点赞 3,534 浏览 2420 个字

将方法作为方法的参数

委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递,这种将方法动态地赋给参数的做法,可以避免在程序中大量使用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

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,497
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,910
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,744
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,498
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:8,136
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:5,300