Derniers tips / Mémos
Modélise nativement « exactement l'un de ces types », avec un switch exhaustif vérifié par le compilateur.
Fin des state machines générées par le compilateur : moins d'allocations et des stack traces enfin lisibles.
Recherche sémantique directement dans SQL Server 2025, sans base vectorielle séparée, en LINQ typé.
Framework UI cross-platform pour .NET : Windows, macOS, Linux, iOS, Android et WebAssembly.
Découvrez les nouvelles APIs asynchrones pour la compression ZIP et les améliorations de performance dans .NET 10
Interfaces : méthodes par défaut
Depuis C# 8, les interfaces peuvent contenir des implémentations par défaut pour des membres. Cela permet d'évoluer une interface sans casser les implémenteurs existants.
Cas d’usage
Faire évoluer une interface sans casser les consommateurs
Ajouter une méthode nouvelle avec une implémentation par défaut pour éviter de forcer la mise à jour des implémenteurs existants.
public interface ILogger
{
void Log(string message);
// nouvelle API avec implémentation par défaut
void LogDebug(string message) => Log($"DEBUG: {message}");
}
public class ConsoleLogger : ILogger
{
public void Log(string message) => Console.WriteLine(message);
}
// ConsoleLogger hérite automatiquement du comportement de LogDebug.Fournir une logique utilitaire partagée
Implémenter de petits helpers réutilisables au plus près du contrat tout en gardant les implémentations concrètes simples.
public interface ISerializer
{
string Serialize(object o);
// helper utilisant la méthode principale
string SerializePretty(object o) => JsonSerializer.Serialize(o, new JsonSerializerOptions { WriteIndented = true });
}
public class MySerializer : ISerializer
{
public string Serialize(object o) => JsonSerializer.Serialize(o);
}
// MySerializer bénéficie de SerializePretty gratuitement.Résumé
Les implémentations par défaut (DIM) aident à faire évoluer les API et à partager de petits helpers. À utiliser avec parcimonie pour ne pas complexifier la polymorphie.
Avantages
- Permet l'évolution non‑cassante des API
- Partage de petits détails d'implémentation entre types
Inconvénients
- Peut créer des ambiguïtés dans des scénarios d'héritage complexes
- Peut cacher du comportement loin des types concrets (surprise pour les implémenteurs)
Bonnes pratiques
- Privilégier des implémentations par défaut courtes et stables; éviter la logique lourde.
- Documenter quand une méthode par défaut dépend d'autres membres de l'interface.
- Préférer les méthodes d'extension ou les classes abstraites si l'implémentation devient volumineuse ou avec état.