泛型委托的基本语法格式如下:
delegate ReturnType DelegateName<Type>(Type x, Type y);
通过实践发现,泛型委托可以大大减少代码量,下面举个例子
如:分别使用四则运算来计算一系列算式,然后汇总计算结果。
一开始我也是很笨的定义了四个四则运算的方法。
class Calculator
{
delegate int calc(int x, int y);
public int Add(int x, int y)
{
return x + y;
}
public int Minus(int x, int y)
{
return x - y;
}
public int Multiply(int x, int y)
{
return x + y;
}
public int Divide(int x, int y)
{
if (y != 0)
return x / y;
else throw new Exception("Cannot divide by zero.!");
}
}
然后在使用的时定义委托实例,,传递方法。
static void Main(string[] args)
{
Calculator calc = new Calculator();
Calculator.DCalc dc = calc.Add;
int addResult = dc.Invoke(3, 4);
dc = calc.Minus;
int minusResult = dc.Invoke(3, 4);
dc = calc.Multiply;
int multiplyResult = dc.Invoke(3, 4);
dc = calc.Divide;
int dividedResult = dc.Invoke(3, 4);
int result = addResult + minusResult + multiplyResult + dividedResult;
Console.WriteLine(result);
Console.Read();
}
看看换成泛型委托会变成什么样
这时我们的计算类更为简洁
class Calculator
{
public delegate T CalcDelegate<T>(T x, T y);
}
而对于调用,则需要定义各类运算的代码,这里使用了匿名函数:
static void Main(string[] args)
{
Calculator.CalcDelegate<int> dc = new Calculator.CalcDelegate<int>((a, b) =>
{
return a + b;
});
int addResult = dc.Invoke(3, 4);
dc = new Calculator.CalcDelegate<int>((a, b) =>
{
return a - b;
});
int minusResult = dc.Invoke(3, 4);
dc = new Calculator.CalcDelegate<int>((a, b) =>
{
return a * b;
});
int multiplyResult = dc.Invoke(3, 4);
dc = new Calculator.CalcDelegate<int>((a, b) =>
{
if (b != 0) return a / b;
else throw new Exception("Cannot divide by zero.!");
});
int dividedResult = dc.Invoke(3, 2);
int result = addResult + minusResult + multiplyResult + dividedResult;
Console.WriteLine(result);
Console.Read();
}
由此可见,泛型委托帮助我们减少了对象成员的定义工作。