在实际的开发中,要用到很多的函数。而针对这些函数的一些共性的操作,也可以形成一个函数。因为是共性的操作,所以不需要具体地针对每个函数都定义,而只要一个函数的代表就可以了。比如,求积分操作, 它的方法对所有函数都是适用的。
使用了函数的代表delegate关键词以后,就生成了一个函数代表类。类名是我们自定义的。这个类的声明形式不同于一般的class classname{}的形式。我想,是因为要和函数的定义形式一致,更直观地体现这个函数代表类的类型。一个函数的类型包括返回值类型和参数类型,这就是一个函数的全部类型。都直观体现在函数代表的声明中,如下所示:
函数代表类的声明:
delegate double FuctionDelegate(double x);
使用函数代表类:
FunctionDelegate fd = new FunctionDelegate(FunctionName);//生成一个函数代表对象
熟悉C指针的都知道,FunctionDelegate对象包含的应该是函数的指针。所以在生成函数代表对象的时候,参数不是定义时括号里面的参数,而是函数的名字。这样就把函数的指针传递给了fd对象。这是很别扭的地方,新建类的时候括号里的参数竟然和定义时括号里的参数不一致。希望C#在以后可以改进。但是,如果你知道FunctionDelegate类在声明的时候,那个形式,只是为了表明函数的类型,那么新建的时候的形式,也是可以勉强理解的。当然,传递指针的函数的类型要和定义FunctionDelegate时候的函数类型是一致,这自不必说。
下面的代码就是我使用函数代表类对若干函数求积分,对积分操作函数只定义一次就可以了。
/*
* Created by SharpDevelop.
* User: Administrator
* Date: 2016/11/8
* Time: 11:04
*
* To change this template use Tools | Options | Coding | Edit Standard Headers.
*/
using System;
namespace IntegralUseDelegate
{
delegate double Function(double x);
class F {
public static double Quad(Function f,double lower,double upper)
{
double precision;
precision = 0.0001;
int n;
n = Convert.ToInt32( (upper- lower)/precision );
double sum;
sum = 0;
int i;
for(i=0;i<n;i++)
sum += f( lower + precision*i )*precision;
return sum;
}
}
class Program {
public static void Main(string[] args)
{
double q1,q2;
q1 = F.Quad(Math.Sin,0,Math.PI/2);
q2 = F.Quad(Math.Log10,1,1000);
Console.WriteLine(q1);
Console.WriteLine(q2);
Console.Write("Press any key to continue . . . ");
Console.ReadKey(true);
}
}
}