后端开发 \ C# \ c#委托

c#委托

总点击42
简介:委托是一种可以把引用存储为函数的类型。委托声明非常类似于函数,但不带函数体,而且要使用delegate关键字。委托的声明指定了一个函数签名,其中包含一个返回函数和参数列表。在定义了委托之后,就可以声明该

委托是一种可以把引用存储为函数的类型。委托声明非常类似于函数,但不带函数体,而且要使用delegate关键字。委托的声明指定了一个函数签名,其中包含一个返回函数和参数列表。在定义了委托之后,就可以声明该委托类型的变量。接着把这个变量初始化为与委托有相同签名的函数引用。之后就可以使用委托变量调用这个函数,就像该变量是一个函数一样。

如下使用委托调用函数:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

namespace ConsoleApplication4

{

class Program

{

delegate double ProcessDelegate(double param1,double param2);

static double Multiply(double param1,double param2)

{

return param1 * param2;

}

static double Divide(double param1,double param2)

{

return param1 / param2;

}

static void Main(string[] args)

{

ProcessDelegate process;

Console.WriteLine("Enter 2 numbers separated with a comma:");

string input = Console.ReadLine();

int comPos = input.IndexOf(",");

double param1 = Convert.ToDouble(input.Substring(0,comPos));

double param2 = Convert.ToDouble(input.Substring(comPos + 1,input.Length - 1 - comPos));

Console.WriteLine("Enter M to Multiply or D to Divite:");

input = Console.ReadLine();

if (input == "M")

{

process = new ProcessDelegate(Multiply);

}else

{

process = new ProcessDelegate(Divide);

}

Console.WriteLine("The result is:{0}",process(param1,param2));

Console.ReadKey();

}

}

}


再如在网上找到的简单例子:

public delegate void BugTicketEventHandler();


delegate 是关键词,【注:EventHandler是一个声明委托的微软C#的命名标准,我的习惯是标准就要第一时间说,也就这个命名习惯要第一时间养成】

完了,这就是委托,就这么简单,看看和我们一般的方法有什么区别呢?

代码

Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->//小张类

public class MrZhang

{

//其实买车票的悲情人物是小张

public static void BuyTicket()

{

Console.WriteLine("NND,每次都让我去买票,急人呀!");

}

}

//小明类

class MrMing

{

//声明一个委托,其实就是个“命令”

public delegate void BugTicketEventHandler();

public static void Main(string[] args)

{

//这里就是具体阐述这个命令是干什么的,本例是MrZhang.BuyTicket“小张买车票”

BugTicketEventHandler myDelegate = new BugTicketEventHandler(MrZhang.BuyTicket);

//这时候委托被附上了具体的方法

myDelegate();

Console.ReadKey();

}

}


BugTicketEventHandlermyDelegate=newBugTicketEventHandler(MrZhang.BuyTicket);

这是委托的声明方法,BugTicketEventHandler(委托的方法);委托的方法必须要加上,因为委托的构造函数是不为空的。

注:委托的参数和返回类型,都要和你要具体委托的方法要一致,例:

publicdelegatevoidBugTicketEventHandler();


publicstaticvoidBuyTicket()


{


Console.WriteLine("NND,每次都让我去买票,鸡人呀!");


}

同学们,看到这里可以先消化消化,休息一下,我们简单的讲一下委托链的概念:

其实委托链也是相当的简单,在现实生活中,小明叫小张买完车票之后,可能接着又让他带张电影票,

而我们程序世界里的表述为:

Code highlighting produced by Actipro CodeHighlighter (freeware)

http://www.CodeHighlighter.com/

-->//小张类

public class MrZhang

{

//其实买车票的悲情人物是小张

public static void BuyTicket()

{

Console.WriteLine("NND,每次都让我去买票,鸡人呀!");

}

public static void BuyMovieTicket()

{

Console.WriteLine("我去,自己泡妞,还要让我带电影票!");

}

}

//小明类

class MrMing

{

//声明一个委托,其实就是个“命令”

public delegate void BugTicketEventHandler();

public static void Main(string[] args)

{

//这里就是具体阐述这个命令是干什么的,本例是MrZhang.BuyTicket“小张买车票”

BugTicketEventHandler myDelegate = new BugTicketEventHandler(MrZhang.BuyTicket);

myDelegate += MrZhang.BuyMovieTicket;

//这时候委托被附上了具体的方法

myDelegate();

Console.ReadKey();

}

}


其实,我们只是在程序中加了myDelegate+=MrZhang.BuyMovieTicket;

这时这个委托就相当于要做2件事情,先是买车票,再是买电影票拉!


0人推荐

推荐文章

热门标签

意见反馈 常见问题 官方微信 返回顶部