Esistono un paio di tipi generici in .Net (v2 e versioni successive) che rendono molto semplice il passaggio di funzioni come delegati.
Per le funzioni con tipi di restituzione, è presente <> e per le funzioni senza tipi di restituzione è presente <>.
Sia Func che Action possono essere dichiarati per accettare da 0 a 4 parametri. Ad esempio, Func <double, int> accetta un doppio come parametro e restituisce un int. L'azione <double, double, double> accetta tre doppie come parametri e non restituisce nulla (nulla).
Quindi puoi dichiarare la tua funzione Diff per prendere un Func:
public double Diff(double x, Func<double, double> f) {
double h = 0.0000001;
return (f(x + h) - f(x)) / h;
}
E poi lo chiami così, semplicemente assegnandogli il nome della funzione che si adatta alla firma del tuo Func o Action:
double result = Diff(myValue, Function);
Puoi persino scrivere la funzione in linea con la sintassi lambda:
double result = Diff(myValue, d => Math.Sqrt(d * 3.14));