举例理解C#中的委托

来源:互联网 发布:肯尼迪 知乎 编辑:程序博客网 时间:2024/06/07 14:31

有时需要将一个函数作为另一个函数的参数,这是就要用到委托。

定义委托:

delegate void AnimalPlay(string name);

函数(以AnimalPlay型委托为参数)

static void CircusStart(AnimalPlay animalPlay, string name)

{

    //传入要调用的方法,和被调用的方法所需的参数,这里的参数必须与被调用方法的参数类型一致。

    Console.WriteLine("开始");

    animalPlay(name);

}

static void DogPlay(string greetings)

{

    Console.WriteLine("{0},I am dogPlay! WangWang", greetings);

}

static void CatPlay(string greetings)

{

    Console.WriteLine("{0},I am CatPlay! MiaoMiao", greetings);

}

在主函数中使用委托:

static void Main(string[] args)

{

    //把函数DogPlay()转换为AnimalPlay型委托

    AnimalPlay deleDogPlay = new AnimalPlay(DogPlay);

    //把委托deleDogPlay传给函数CircusStart()

    CircusStart(deleDogPlay, "Good evening");

}

输出:Good evening, I am DogPlay! WangWang

相当于:

static void Main(string [] args)

{

    CircusStart(new AnimalPlay(CatPlay), "Good morning");

}

输出:Good morning, I am CatPlay! MiaoMiao

        在我们的程序中,我们总是调用函数CircusStart(),定义该函数时,我们不知道也不关心传递给它的委托到底代表哪个函数,直到调用函数CircusStart(),并把实际参数传递给它时,这个函数才具体化。传给它什么样的具体函数,就执行哪个方法。

在新版本的.NET中,可以直接传递函数名称,省去把函数转换为委托实例的过程。

static void Main(string[] args)

{

    CircusStart(DogPlay, "Hello everyone!");

}

输出:Hello everyone!, I am DogPlay! WangWang

多播委托
static void Main(string[] args)
{
    AnimalPlay animalsPlay = new AnimalPlay(DogPlay);
    animalsPlay += new AnimalPlay(CatPlay);

    CircusStart(animalsPlay,"Good afternoon");
}
两个函数被依次调用。

输出:Hello everyone!, I am DogPlay! WangWang

        Good morning, I am CatPlay! MiaoMiao

        多播委托的返回值一般为void,如果为非void类型,多播委托可能有多个返回值(因为会调用多个函数),这时多播委托将返回最后一个方法的返回值。但实际中不推荐这样应用,因为这些方法的调用顺序未正式定义,因此应避免编写依赖于特定调用顺序的代码。


原创粉丝点击