/*
委托
*/
using System;
namespace Frank
{
public class Test
{
private delegate string GetAString();//定义委托
private delegate double DoubleOp(double x);//定义第二个委托
public static void Main(string[] args)
{
GetAString str = new GetAString(1.ToString);
GetAString str2 = 1.ToString;//自动类型推断
Console.WriteLine(str());//执行int类型里面的ToString方法输出1
//完整写法
str = new GetAString(new Test().Print);
System.Console.WriteLine(str.Invoke());//执行委托上面的方法
//简写模式
str = new Test().Print;
System.Console.WriteLine(str());
//利用委托数组执行多个操作
DoubleOp[] operations = new DoubleOp[]
{
new DoubleOp(Test2.MultiplyByTwo),//第一个操作全写模式
Test2.Square//第二个操作,简写模式
};
for(int i = 0;i < operations.Length; i++)
{
System.Console.WriteLine("i = " +i);
ProcessAndDisplayNumber(operations[i],2.0+i);
}
//使用Func委托
Func<double,double>[] operations2 = new Func<double,double>[]
{
new Func<double,double>(Test2.MultiplyByTwo),
Test2.Square
};
for(int i = 0;i < operations2.Length; i++)
{
System.Console.WriteLine("i = " +i);
ProcessAndDisplayNumber(operations2[i],2.0+i);
}
}
public string Print()
{
System.Console.WriteLine("委托执行方法!");
return "sadas---";
}
static void ProcessAndDisplayNumber(DoubleOp action,double value)//带委托参数的普通方法
{
double result = action.Invoke(value);//或者action()
System.Console.WriteLine("value {0} 计算后的值 {1}",value,result);
}
static void ProcessAndDisplayNumber(Func<double,double> action,double value)//重载一个带泛型委托参数的普通方法
{
double result = action(value);//执行委托
Console.WriteLine(result);
}
}
public class Test2//自定义类
{
public static double MultiplyByTwo(double value)
{
return value * 2;
}
public static double Square(double value)
{
return value * value;
}
}
}