Partager via


Fonctions inline (F#)

Les fonctions inline sont des fonctions intégrées directement au code appelant.

Utilisation de fonctions inline

Lorsque vous utilisez des paramètres de type statique, toutes les fonctions paramétrables par des paramètres de type doivent être inline. Cela garantit que le compilateur peut résoudre ces paramètres de type. Lorsque vous utilisez des paramètres de type générique ordinaires, cette restriction n'existe pas.

Si les fonctions inline permettent l'utilisation de contraintes de membre, elles sont également utiles en matière d'optimisation du code. Toutefois, tout emploi excessif des fonctions inline peut rendre votre code moins résistant aux modifications apportées aux optimisations du compilateur et à l'implémentation de fonctions de bibliothèque. Pour cette raison, évitez d'utiliser des fonctions inline à des fins d'optimisation, à moins que vous n'ayez épuisé toutes les autres techniques d'optimisation. Le fait de rendre une fonction ou une méthode inline peut parfois améliorer les performances, mais ce n'est pas toujours le cas. Par conséquent, vous devez vérifier que le fait de rendre une fonction donnée inline a bien un effet positif sur les performances, en mesurant ces dernières.

Le modificateur inline peut être appliqué à des fonctions au niveau supérieur, au niveau du module ou au niveau d'une méthode dans une classe.

L'exemple de code suivant illustre une fonction inline au niveau supérieur, une méthode d'instance inline et une méthode statique inline.

let inline increment x = x + 1
type WrapInt32() =
    member inline this.incrementByOne(x) = x + 1
    static member inline Increment(x) = x + 1

Fonctions inline et inférence de type

La présence de fonctions inline affecte l'inférence de type. En effet, les fonctions inline peuvent avoir des paramètres de type résolus statiquement, alors que les autres fonctions ne le peuvent pas. L'exemple de code suivant illustre un cas où inline est utile parce que vous utilisez une fonction qui a un paramètre de type résolu statiquement, l'opérateur de conversion float.

let inline printAsFloatingPoint number =
    printfn "%f" (float number)

Sans le modificateur inline, l'inférence de type force la fonction à prendre un type spécifique, dans ce cas int. En revanche, avec le modificateur inline, la fonction est également déduite comme ayant un paramètre de type résolu statiquement. Avec le modificateur inline, le type est déduit comme étant le suivant :

^a -> unit when ^a : (static member op_Explicit : ^a -> float)

Cela signifie que la fonction accepte tout type qui prend en charge une conversion en float.

Voir aussi

Référence

Fonctions (F#)

Contraintes (F#)

Paramètres de type résolus statiquement (F#)