C#传递函数作为参数

我已经写了一个函数在C#中进行数值区分。 它看起来像这样:

public double Diff(double x) { double h = 0.0000001; return (Function(x + h) - Function(x)) / h; } 

我希望能够通过任何function,如:

 public double Diff(double x, function f) { double h = 0.0000001; return (f(x + h) - f(x)) / h; } 

我认为这可能与代表(也许?),但我不知道如何使用它们。

任何帮助将不胜感激。

如上所述使用Func可以工作,但也有一些代表可以执行相同的任务,并且还可以在命名中定义意图:

 public delegate double MyFunction(double x); public double Diff(double x, MyFunction f) { double h = 0.0000001; return (f(x + h) - f(x)) / h; } public double MyFunctionMethod(double x) { // Can add more complicated logic here return x + 10; } public void Client() { double result = Diff(1.234, x => x * 456.1234); double secondResult = Diff(2.345, MyFunctionMethod); } 

.Net(v2及更高版本)中有一些genericstypes,它们使代码中的传递函数非常容易。

对于具有返回types的函数,有Func <>,对于没有返回types的函数,有Action <>。

Func和Action都可以被声明为从0到4个参数。 例如,Func <double,int>将一个double作为参数,并返回一个int。 Action <double,double,double>将三个双精度值作为参数,并返回任何值(void)。

所以你可以声明你的Diff函数采取一个Func:

 public double Diff(double x, Func<double, double> f) { double h = 0.0000001; return (f(x + h) - f(x)) / h; } 

然后你可以这么称呼它,只要给它一个符合你的Func或Action签名的函数的名称:

 double result = Diff(myValue, Function); 

你甚至可以使用lambda语法来编写函数:

 double result = Diff(myValue, d => Math.Sqrt(d * 3.14)); 
 public static T Runner<T>(Func<T> funcToRun) { //Do stuff before running function as normal return funcToRun(); } 

用法:

 var ReturnValue = Runner(() => GetUser(99));