委托的例子
using System; using System.Collections.Generic; using System.Text; using System.IO; namespace ConsoleDelget { class set { private object[] items; public set(int numItems) { items = new object[numItems]; for (int i = 0; i < numItems; i++) items[i] = i; } public delegate void Feedback(object value, int item, int numitems); public void ProcessItems(Feedback feedback) { for (int item = 0; item < items.Length; item++) { if (feedback != null) feedback(items[item], item + 1, items.Length); } } } class Program { static void Main(string[] args) { StaticCallback(); InstanceCallback(); } static void StaticCallback() { set setOfitems = new set(5); setOfitems.ProcessItems(null); Console.WriteLine(); //处理items元素并反馈输出到控制台 setOfitems.ProcessItems(new set.Feedback(Program.FeedbackToConsole)); Console.WriteLine(); //处理items元素并反馈输出到控制台 set.Feedback fb = null; fb += new set.Feedback(Program.FeedbackToConsole); setOfitems.ProcessItems(fb); Console.WriteLine(); } static void InstanceCallback() { set setOfitems = new set(5); setOfitems.ProcessItems(null); //处理items元素并反馈到文件 Program app = new Program(); setOfitems.ProcessItems(new set.Feedback(app.FeedbackToFile)); Console.WriteLine(); } static void FeedbackToConsole(object value,int item,int numitems) { Console.WriteLine("procssing item {0} of {1}:{2}",item,numitems,value); } private void FeedbackToFile(object value, int item, int numitems) { StreamWriter sw = new StreamWriter("E:\\xm\\test.txt", true); sw.WriteLine("procssing item {0} of {1}:{2}", item, numitems, value); sw.Close(); } } }
委托是面向对象的,类型安全的,是引用类型(开始就说了委托是个类),所以在使用委托时首先要 定义——>声明——>实例化——>作为参数传递给方法——>使用委托。下面就具体看下如何使用委托的:
一、定义:delegate void Mydelegate(type1 para1,type2 para2);
二、声明: Mydelegate d;
三、实例化:d =new Mydelegate(obj.InstanceMethod);(把一个方法传递给委托的构造器),前面三步就好比构造一个律师对象,方法InstanceMethod好比是当事人
四、作为参数传递给方法:MyMethod(d);(委托实现把方法作为参数传入到另一个方法,委托就是一个包装方法的对象)
五、在方法中使用委托。MyMethod方法好比是法官,MyMethod方法先调用委托,委托在调用方法InstanceMethod,这个过程就如法官向律师问话,然后律师之前肯定向当事人了解了案件的情况。C#委托中好比是律师,真真诉说案情的是当事人(真真被调用的是实例方法InstanceMethod)
MyMethod方法的定义如下:
privatevoid MyMethod(Mydelegate mydelegate)
{ // 使用委托 mydelegat(arg1,arg2); }
InstanceMethod方法定义如下:
privatevoid InstanceMethod(type1 para1, type2 para2)
{ // 定义方法
console.write("hahha"+para1,para2);
}