Extensions de type
Définition
Membres d'un type définis hors de son bloc type
principal.
Chacun de ces membres est appelé une augmentation.
3 catégories d'extension :
Extension intrinsèque
Extension optionnelle
Méthodes d'extension
Extension intrinsèque
Définie dans même fichier et même namespace que le type
→ Membres intégrés au type à la compilation, visibles par Reflection
💡 Cas d'usage
Déclarer successivement :
Type (ex :
type List
)Module compagnon de ce type (ex : fonction
List.length list
)Extension utilisant ce module compagnon (ex : membre
list.Length
)
👉 Façon + propre en FP de séparer les fonctionnalités des données
💡 Inférence de types marche mieux avec fonctions que membres
Exemple :
Extension optionnelle
Extension définie au-dehors du module/namespace/assembly du type étendu.
💡 Pratique pour les types dont la déclaration n'est pas modifiable directement, par exemple ceux issus d'une librairie.
Compilation : en méthode statique → version simplifiée :
Usage : comme un vrai membre, après avoir importé son module :
Autre exemple :
Limites
Doit être déclarée dans un module
Pas compilée dans le type, pas visible par Reflection
Membres visibles qu'en F#, invisibles en C#
Extension de type et surcharges
☝ Implémenter des surcharges :
Recommandé dans la déclaration initiale du type ✅
Déconseillé dans une extension de type ⛔
Extension de type et alias de type
Sont incompatibles :
💡 Solution : il faut utiliser le vrai nom du type
☝ Les tuples F♯ tels-que (ex : int * int
) ne peuvent pas être augmentés ainsi.
💡 Mais on peut avec une méthode d'extension à la C# 📍
Limite
Extension autorisée sur type générique sauf quand les contraintes sont différentes :
Solution : méthode d'extension à la C# 📍
Méthode d'extension
Méthode statique :
Décorée de
[<Extension>]
Définie dans classe
[<Extension>]
Type du 1er argument = type étendu (
IEnumerable<'T>
ci-dessous)
Exemple simplifié :
Pseudo équivalent en C♯ :
☝ Note : en vrai, il y a plein de Sum()
dans LINQ pour chaque type : int
, float
…
Tuples
On peut ajouter une méthode d'extension à tout tuple F♯ :
Comparatif
Méthodes
✅ instance, ✅ statique
✅ instance, ❌ statique
Propriétés
✅ instance, ✅ statique
❌ Non supporté
Constructeurs
✅ intrinsèque, ❌ optionnelle
❌ Non supporté
Étendre contraintes
❌ Non supporté
✅ Supporte SRTP
Limites
Ne participent pas au polymorphisme :
Pas dans table virtuelle
Pas de membre
virtual
,abstract
Pas de membre
override
(mais surcharges 👌)
Extensions vs classe partielle C♯
Classe partielle C♯
✅ Oui
✅ Oui
Que partial class
Extens° intrinsèque
❌ Non
✅ Oui
✅ Oui
Extens° optionnelle
✅ Oui
❌ Non
✅ Oui
Dernière mise à jour
Cet article vous a-t-il été utile ?