在實際的開發中,要用到很多的函數。而針對這些函數的一些共性的操作,也可以形成一個函數。因為是共性的操作,所以不需要具體地針對每個函數都定義,而只要一個函數的代表就可以了。比如,求積分操作, 它的方法對所有函數都是適用的。
使用了函數的代表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); } }}