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 :

  1. Type (ex : type List)

  2. Module compagnon de ce type (ex : fonction List.length list)

  3. 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

Code source

Tuples

On peut ajouter une méthode d'extension à tout tuple F♯ :

Comparatif

Fonctionnalité
Extension de type
Méthode d'extension

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♯

Fonctionnalité
Multi-fichiers
Compilé dans type
Tout type

Classe partielle C♯

✅ Oui

✅ Oui

Que partial class

Extens° intrinsèque

❌ Non

✅ Oui

✅ Oui

Extens° optionnelle

✅ Oui

❌ Non

✅ Oui

Mis à jour

Ce contenu vous a-t-il été utile ?