我对委托的理解
通过定义委托可以把一个方法作为一个参数传递给另外一个方法,实现了一个方法能调用处理另一个方法
1.C#中声明委托:
通过delegate关键字声明委托,委托可以定义类的任何地方定义,类内部,外部,还可以在命名空间中把委托定义为顶层对象,可以给委托加上一般的访问修饰符(public,private,等)
如:public delegate string delegateexample();
上面就定义了一个返回值为string类型 不带参数 的委托;所以他传递的方法也必须是一个返回值为string类型 不带参数的方法~~~,这也就是委托的安全性,不象c++指针那样。
2.在C#中使用委托:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Delegate
{
//定义了一个返回值为double带一个double类型参数的委托
public delegate double DoubleOp(double x);
public class MathOperations
{
public static double MulitplayByTow(double number)
{
return number * 2;
}
public static double Square(double number)
{
return number * number;
}
}
class Program
{
static void Main(string[] args)
{ //声明了一个委托数组,分别指向了MathOperations的MulitpalyByTow方法和Square方法
DoubleOp[] operations =
{
new DoubleOp(MathOperations.MulitplayByTow),
new DoubleOp(MathOperations.Square)
};
for (int i = 0; i < operations.Length; i++)
{
Console.WriteLine("User operations[{0}]",i);
//把委托传递给方法
ProcessAndDisplayNumber(operations[i], 45);
}
}
private static void ProcessAndDisplayNumber(DoubleOp doubleOp, double p)
{
double result = doubleOp(p);
Console.WriteLine("结果是{0}", result);
}
}
}
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Delegate
{
//定义了一个返回值为double带一个double类型参数的委托
public delegate double DoubleOp(double x);
public class MathOperations
{
public static double MulitplayByTow(double number)
{
return number * 2;
}
public static double Square(double number)
{
return number * number;
}
}
class Program
{
static void Main(string[] args)
{ //声明了一个委托数组,分别指向了MathOperations的MulitpalyByTow方法和Square方法
DoubleOp[] operations =
{
new DoubleOp(MathOperations.MulitplayByTow),
new DoubleOp(MathOperations.Square)
};
for (int i = 0; i < operations.Length; i++)
{
Console.WriteLine("User operations[{0}]",i);
//把委托传递给方法
ProcessAndDisplayNumber(operations[i], 45);
}
}
private static void ProcessAndDisplayNumber(DoubleOp doubleOp, double p)
{
double result = doubleOp(p);
Console.WriteLine("结果是{0}", result);
}
}
}
3.匿名方法:
书上说使用匿名方法可以减少系统开销,这么不晓得,呵呵,书上说能就能吧,反正我只知道可以少写代码
下面是使用匿名方法修改上面的代码,最明显的效果就是使用匿名方法可以不用单独编写要被委托的方法了
如下:
class Program
{
static void Main(string[] args)
{
Console.WriteLine("在委托中使用匿名方法");
DoubleOp multByTwo = delegate(double val) { return val * 2;};
DoubleOp square = delegate(double val) { return val * val; };
DoubleOp[] operations1={multByTwo,square};
for(int i=0;i<operations1.Length;i++)
{
Console.WriteLine("User operations[{0}]",i);
//把委托传递给方法
ProcessAndDisplayNumber(operations[i], 45);
}
}
private static void ProcessAndDisplayNumber(DoubleOp doubleOp, double p)
{
double result = doubleOp(p);
Console.WriteLine("结果是{0}", result);
}
}
{
static void Main(string[] args)
{
Console.WriteLine("在委托中使用匿名方法");
DoubleOp multByTwo = delegate(double val) { return val * 2;};
DoubleOp square = delegate(double val) { return val * val; };
DoubleOp[] operations1={multByTwo,square};
for(int i=0;i<operations1.Length;i++)
{
Console.WriteLine("User operations[{0}]",i);
//把委托传递给方法
ProcessAndDisplayNumber(operations[i], 45);
}
}
private static void ProcessAndDisplayNumber(DoubleOp doubleOp, double p)
{
double result = doubleOp(p);
Console.WriteLine("结果是{0}", result);
}
}
匿名方法的使用规则这里就不说了