C#基础:对委托的简单理解
2012-06-13 22:44
381 查看
转载至:C#基础:对委托的简单理解 - 海豚座 - 博客园
在编程过程中,我们习惯把数据作为参数传递给方法(例:int a=int.Parse(“20”);)。是否能将一个方法传递给另一个方法呢?是不是听起来有点奇怪!!!
线程大家应该熟悉吧,在计算机中并行运行新的执行序列同时运行当前的任务,这个新的序列就是线程。在Thread()的一个实例上使用方法Start()就可以启动一个新的线程。如果要告诉计算机启动一个新的序列,就必须说明要在哪里启动一个新的序列。就必须为计算机提供开始启动的方法的细节,Thread构造函数必须带一个参数,该参数定义了线程需要调用的方法。
一、声明委托
当我们只用一个类时,首先我们需要定义一个类,然后实例化类的一个对象。委托也一样,也需要进行这两个步骤,首先需要定义要使用的委托,定义委托就是要告诉编译器此委托需要那种类型的方法,然后创建委托的一个或多个实例。下面我们定义一个委托:
在上面定义的委托中,定义了一个Dmethod委托,该委托的每个实例都可以包含一个方法的使用,并该方法必须带有一个int类型的参数,并且返回void。委托的类型安全非常高,在定义委托时必须给出委托所表示的方法的签名(int parm)和返回类型等细节(void)。
如果我们要定义一个委托Medthod,该委托表示的方法有两个string参数,返回类型为bool,我们就可以编写如下代码
委托可以在一个类的内部定义,也可以在一个类的外部定义,还可以在名称空间中把委托定义为一个顶层对象,故可以在在定义委托是定义访问修饰符:public private protected等,如下代码所示。
最后需要提出的一点就是:类有两个不同的术语,“类”表示较广义的定义,“对象“表示类的实例。委托只有一个术语,就是在创建委托的实例时,所创建的委托的实例也成为委托。所以需要从上下文中确定委托的确切函数。
二、使用委托
就直接上代码了
这段代码中,实例化了一个类型doplus的委托,并进行了初始化,使它引用plus(int x,int y)的方法(注:委托在语法上总是接收一个参数的构造函数,这个参数就是委托引用的方法,这个方法必须匹配最初定义委托时的签名。另外注意,plus(int x, int y)不是静态方法,所以需要实例化一个Program来正确初始化委托)。委托的一个特征是它们是类型安全的,可以确保被调用的方法的签名是正确的,它们不关心在什么类型的对象上调用方法。甚至不考虑此方法是静态的还是实例方法(如上例所示方法plus和plus1)
三、简单的委托示例
在下面的示例中,我们定义一个Calculated类来实现数据类型为Double的值的加减乘除运算
运行结果
在编程过程中,我们习惯把数据作为参数传递给方法(例:int a=int.Parse(“20”);)。是否能将一个方法传递给另一个方法呢?是不是听起来有点奇怪!!!
线程大家应该熟悉吧,在计算机中并行运行新的执行序列同时运行当前的任务,这个新的序列就是线程。在Thread()的一个实例上使用方法Start()就可以启动一个新的线程。如果要告诉计算机启动一个新的序列,就必须说明要在哪里启动一个新的序列。就必须为计算机提供开始启动的方法的细节,Thread构造函数必须带一个参数,该参数定义了线程需要调用的方法。
一、声明委托
当我们只用一个类时,首先我们需要定义一个类,然后实例化类的一个对象。委托也一样,也需要进行这两个步骤,首先需要定义要使用的委托,定义委托就是要告诉编译器此委托需要那种类型的方法,然后创建委托的一个或多个实例。下面我们定义一个委托:
delegate void Method(int parm);
在上面定义的委托中,定义了一个Dmethod委托,该委托的每个实例都可以包含一个方法的使用,并该方法必须带有一个int类型的参数,并且返回void。委托的类型安全非常高,在定义委托时必须给出委托所表示的方法的签名(int parm)和返回类型等细节(void)。
如果我们要定义一个委托Medthod,该委托表示的方法有两个string参数,返回类型为bool,我们就可以编写如下代码
delegate bool Medthod(string x,string y);
委托可以在一个类的内部定义,也可以在一个类的外部定义,还可以在名称空间中把委托定义为一个顶层对象,故可以在在定义委托是定义访问修饰符:public private protected等,如下代码所示。
delegate string Method();
最后需要提出的一点就是:类有两个不同的术语,“类”表示较广义的定义,“对象“表示类的实例。委托只有一个术语,就是在创建委托的实例时,所创建的委托的实例也成为委托。所以需要从上下文中确定委托的确切函数。
二、使用委托
就直接上代码了
class Program { private delegate string Method(int x, int y); static void Main(string[] args) { Program p = new Program();//因为plus方法不是静态方法,所以需要实例化一个实例的方法(lpus)来正确的初始化委托 Method doplus=new Method(p.plus);//只传递方法名称 //Method doplus = p.plus;//此实例委托和上面一句等价 Console.WriteLine("结果为:{0}", doplus(10, 20)); //Console.WriteLine("结果为:{0}",doplus.Invoke(10,20));//doplus(10, 20)和doplus.Invoke(10,20)等价 } public string plus(int x, int y) { return (x + y).ToString(); } }
这段代码中,实例化了一个类型doplus的委托,并进行了初始化,使它引用plus(int x,int y)的方法(注:委托在语法上总是接收一个参数的构造函数,这个参数就是委托引用的方法,这个方法必须匹配最初定义委托时的签名。另外注意,plus(int x, int y)不是静态方法,所以需要实例化一个Program来正确初始化委托)。委托的一个特征是它们是类型安全的,可以确保被调用的方法的签名是正确的,它们不关心在什么类型的对象上调用方法。甚至不考虑此方法是静态的还是实例方法(如上例所示方法plus和plus1)
三、简单的委托示例
在下面的示例中,我们定义一个Calculated类来实现数据类型为Double的值的加减乘除运算
using System; namespace DelegateTest { class Program { public delegate double operation(double x, double y); static void Main(string[] args) { operation Add = new operation(Calculate.addtion); operation Sub = new operation(Calculate.subtraction); Calculate cal = new Calculate();//引用非静态方法必须实例化对象 operation Mul = new operation(cal.multiplication); operation Div = new operation(cal.division); Console.WriteLine("加法操作(10+20)的结果为:{0}",Add(10,20)); Console.WriteLine("减法操作(50-25)的结果为:{0}",Sub(50,20)); Console.WriteLine("乘法操作(15*12)的结果为:{0}",Mul(15,20)); Console.WriteLine("除法操作(90/12)的结果为:{0}",Div(90,12)); } } public class Calculate { public static double addtion(double x, double y) { return x + y; } public static double subtraction(double x, double y) { return x - y; } public double multiplication(double x, double y) { return x * y; } public double division(double x, double y) { return x / y; } } }
运行结果
![](http://pic002.cnblogs.com/images/2012/215859/2012061222174135.png)
相关文章推荐
- C#基础:对委托的简单理解
- C#中委托的最简单理解方式
- C#基础篇 - 理解委托和事件
- 我关于c#中委托的简单理解
- c#打包文件解压缩 C#中使用委托、接口、匿名方法、泛型委托实现加减乘除算法 一个简单例子理解C#的协变和逆变 对于过长字符串的大小比对
- C#基础系列——委托实现简单设计模式
- C#中的委托之简单声明(基础一)
- 我关于c#中委托的简单理解
- C#零基础学习理解委托
- C#委托零基础理解
- C#基础教程(简单易懂)-神马是委托?
- C#委托零基础理解
- C#基础系列——委托实现简单设计模式
- 从简单的例子理解委托
- 【基础】C#:委托Action、Action<T>、Func<T>、Predicate<T>
- 对C#委托及事件委托的理解
- (C#基础)反射理解
- 【基础】C# 中的委托和事件
- C#委托-怎样理解C#中“委托”的含义和用途
- 深入对C#中委托的理解及应用