Inlinefunktionen (F#)
Inlinefunktionen sind Funktionen, die direkt in den aufrufenden Code integriert sind.
Verwenden von Inlinefunktionen
Wenn Sie statische Typ-Parameter verwenden, müssen alle Funktionen, die von Typparametern parametrisiert sind, inline sein. Hierdurch wird garantiert, dass diese Typparameter vom Compiler aufgelöst werden können. Diese Einschränkung gilt nicht, wenn gewöhnliche Typparameter verwendet werden.
Inlinefunktionen ermöglichen nicht nur die Verwendung von Membereinschränkungen, sie können auch für die manuelle Optimierung von Code von Nutzen sein. Die übermäßige Verwendung von Inlinefunktionen kann jedoch die Widerstandsfähigkeit von Code im Hinblick auf Änderungen von Compileroptimierungen und Implementierung von Bibliotheksfunktionen beeinträchtigen. Aus diesem Grund sollten Sie Inlinefunktionen nur dann für die Optimierung verwenden, wenn sie alle anderen Optimierungsverfahren erprobt haben. Wenn eine Funktion oder Methode als Inlinefunktion bzw. -methode festgelegt wird, kann dies manchmal die Leistung erhöhen, jedoch ist dies nicht immer der Fall. Sie sollten daher auch mithilfe von Leistungsmessungen überprüfen, ob die Erstellung einer Inlinefunktion sich auch positiv auswirkt.
Der inline-Modifizierer kann auf Funktionen der obersten Ebene, der Modulebene oder auf Methodenebene in einer Klasse angewendet werden.
Das folgende Codebeispiel veranschaulicht eine Inlinefunktion auf oberster Ebene, eine Inlineinstanzmethode und eine statische Inlinemethode.
let inline increment x = x + 1
type WrapInt32() =
member inline this.incrementByOne(x) = x + 1
static member inline Increment(x) = x + 1
Inlinefunktionen und Typrückschluss
Das Vorhandensein von inline wirkt sich auf den Typrückschluss aus. Dies kommt daher, weil Inlinefunktionen statisch aufgelöste Typparameter aufweisen können, wohingegen Nicht-Inlinefunktionen dies nicht können. Das folgende Codebeispiel veranschaulicht einen Fall, in dem inline hilfreich ist, da eine Funktion verwendet wird, die über einen statisch aufgelösten Typparameter, den float-Konvertierungsoperator, verfügt.
let inline printAsFloatingPoint number =
printfn "%f" (float number)
Ohne den inline-Modifizierer zwingt der Typrückschluss die Funktion zur Übernahme eines bestimmten Typs, in diesem Fall int. Aber mit dem inline-Modifizierer wird die Funktion so abgeleitet, dass sie einen statisch aufgelösten Typparameter aufweist. Mit dem inline-Modifizierer wird der Typ wie folgt per Rückschluss abgeleitet:
^a -> unit when ^a : (static member op_Explicit : ^a -> float)
Dies bedeutet, dass die Funktion jeden Typ akzeptiert, der eine Konvertierung in float unterstützt.