Ein Func
ist im Grunde ein Delegat mit der folgenden Signatur:
public delegate string Func(int I)
Vor C# 2 war der einzige Weg, eine Methode an einen Delegaten (der ein Zeiger auf eine Funktion ist) zu übergeben, das explizite Erstellen einer benannten Methode mit derselben Signatur wie der oben angegebene Delegat, wie zum Beispiel:
public string MyAwsomeFunc(int I)
Und diese Methode konnte an eine Methode übergeben werden, die den Delegaten als Parameter enthält:
public void SomeFunc(Func callback)
C# 2 führte Anonyme Methoden ein, die es uns ermöglichten, Delegaten-Handler "auf die Schnelle" zu erstellen und den Compiler die benannte Methode für uns erstellen zu lassen:
// Einen Delegaten erstellen.
delegate string Func(int x);
// Den Delegaten mit einer anonymen Methode instanziieren.
Func d = delegate(int k) { /* ... */ };
C# 3 führte uns Lambda-Ausdrücke ein, die der bevorzugte Weg sind, um Delegaten in C# zu behandeln. Ein Lambda-Ausdruck ist eine anonyme Methode, die Sie verwenden können, um einen Delegaten zu erstellen. Durch die Verwendung von Lambda-Ausdrücken können Sie lokale Funktionen schreiben, die als Argumente übergeben oder als Rückgabewert von Funktionsaufrufen verwendet werden können:
delegate int del(int i);
del myDelegate = x => x * x // Lamda-Ausdruckssyntax
int j = myDelegate(5); //j = 25
Was in Ihrer Methode passiert, ist, dass sie einen Delegattyp von Func
akzeptiert und die Lamda-Ausdruckssyntax verwendet:
x => Url.Action("Index", new { page = x }) )
x ist der Eingabeparameter für Func, der ein int ist und der der page
-Eigenschaft zugewiesen wird, und die Url.Action-Methode gibt einen String zurück, was der erwartete Rückgabetyp ist. Der Compiler erstellt den Delegatenhandler für uns, sodass wir das nicht manuell tun müssen. Es wäre dasselbe wie bei der Verwendung des folgenden Ansatzes mit einer benannten Methode:
string MyMethod(int I)
{
string result = Url.Action("index", new { page = I });
return result;
}
Dann MyMethod als Parameter senden:
@Html.RecordPager(Model.PagingIngModel, MyMethod(someInt));
Bearbeiten
Einige Lektüre: