被称为神的男人下载:委托(C#2008)
来源:百度文库 编辑:九乡新闻网 时间:2024/04/28 22:38:27
在C#中,委托是包含方法引用的引用类型。可以将委托人为是指向函数的指针。不是直接调用该,而是使用委托指向函数,然后通过调用委托来调用该方法。
1.创建委托
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Delegates
{
classProgram
{
delegate int MethodDelegate(int num1,int num2);
static void Main(string[] args)
{
int num1=5;
int num2=3;
MethodDelegate method = newMethodDelegate(Add);//MethodDelegate method=Add;
if(method != null)
{
Console.WriteLine(method(num1,num2).ToString());
}
}
static int Add(int num1, int num2)
{
return (num1 - num2);
}
}
}
也可以将委托作为形参传递给方法,如同下例所示:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Delegates
{
classProgram
{
delegate int MethodDelegate(int num1,int num2);
static void PerformMathOps(MethodDelegate method, int num1, intnum2)
{
Console.WriteLine(method(num1,num2).ToString());
}
static void Main(string[] args)
{
int num1 = 5;
int num2 = 3;
MethodDelegate method = null;
method = new MethodDelegate(Add);
if(method != null)
{
PerformMathOps(method, num1, num2);
}
}
static int Add(int num1, int num2)
{
return (num1+num2);
}
}
}
2.委托链接(多播委托)
一个委托可以指向多个函数,这称为委托链接。指向多个函数的委托成为多播委托。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Delegates
{
classProgram
{
delegate void MethodDelegate();
static void Main(string[] args)
{
MethodsDelegate methods = Method1;
methods += Method2;
methods += Method3;
methods();
Console.ReadLine();
}
static private void Method1()
{
Console.WriteLine("Method 1");
}
static private void Method2()
{
Console.WriteLine("Method 2");
}
static private void Method3()
{
Console.WriteLine("Method 3");
}
}
}
调试结果:
Method 1
Method 2
Method 3
注意:如果有返回值,只返回为后一个方法的值。若有一个方法异常,不会有返回值。
3.使用委托实现回调
回调是传入函数的方法,在函数结束执行时调用该方法。
如下,有一个执行一系列数学操作的函数。在调用该函数时,也向其传递一个回调方法,从而在函数完成其计算工作时,调用回调方法,向用户通知计算结果。
class Program
{
delegate void callbackDelegate(string Message);
static void Main(string[] args)
{
callbackDelegate result=ResultCallback;
AddTwoNumbers(5,3,result);
Console.ReadLine();
}
static private void AddTwoNumbers(int num1, int num2, callbackDelegatecallback)
{
int result = num1 + num2;
callback("The result is :"+ result.ToString());
}
static private void ResultCallback(string Message)
{
Console.WriteLine(Message);
}
}
callback委托调用ResultCallback()函数,该函数将结果输出到控制台。输出结果如下所示:
The result is : 8
4.异步回调
回调还是在异步的情况下最为有用。
上面例子的同步回调情况下的执行流程:
组织程序较好方式是异步调用AddTwoNumbers()方法,如下图所示。异步调用函数允许主程序继续执行,而不需要等待该函数返回。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Sysstem.Runtime.Remoting.Messaging;
namespace Delegates
{
classProgram
{
delegate int MethodDelegate(int num1,int num2);
tatic void Main(string[] args)
{
MethodDelegate del = AddTwoNumbers;
MethodDelegate del = AddTwoNumbers;
AsyncCallback callback= new AsyncCallback(ResultCallback);
Console.WriteLine("Invoking the method asynchronously...");
IAsyncResult result =del.BeginInvoke(5,3,callback,null);
Console.WriteLine("Continuing with the execution...");
Console.ReadLine();
}
static private int AddTwoNumbers(int num1, intnum2)
{
System.Threading.Thread.Sleep(5000);
return num1 + num2;
}
static private voidResultCallback(IAsyncResult ar)
{
MethodDelegate del =(MethodDelegate)((AsyncResult)ar).AsyncDelegate;
int result =del.EndInvoke(ar);
Console.WriteLine("Result of addition is:"+result.ToString());
}
}
}
AsyncCallback是引用某个方法的委托,当异步操作完成时调用该方法。此处,设置该委托执行ResultCallback;
使用del委托的BeginInvoke()方法异步调用AddTwoNumbers()方法,并且向该方法传递两个整型值(AddTwoNumbers()方法需要这两个整型值)以及在该方法结束执行时回调的委托。
BeginInvoke()方法异步调用委托,在调用异步委托之后,下一条语句会继续执行。该方法返回类型为IAsyncResult的变量,该变量表示异步操作的状态。
定义ResultCallback()方法来获得计算的结果,该方法接受类型为IAsyncResult的实参。
在ResultCallback()方法中,首先使用AsyncDelegate特性获得指向AddTwoNumbers()方法的委托,该特性返回进行异步调用的委托。接下来,使用EndInvoke()方法获得异步调用的结果,向该方法传递IAsyncResult变量(ar)。