1. Quelle est la difference entre une classe et une struct en C# ?
Une classe est un type reference alloue sur le tas (heap), supporte l'heritage et peut etre null. Une struct est un type valeur alloue sur la pile (stack), ne supporte pas l'heritage (mais implemente des interfaces) et ne peut pas etre null (sauf Nullable
2. Expliquez le fonctionnement du garbage collector en .NET.
Le GC .NET gere automatiquement la memoire avec un systeme generationnel a trois niveaux. Generation 0 : objets recemment alloues, collectes frequemment. Generation 1 : objets ayant survecu une collection Gen 0, zone tampon. Generation 2 : objets a longue duree de vie, collectes rarement. Le GC utilise un algorithme mark-and-sweep : il identifie les objets accessibles depuis les racines (variables statiques, pile, handles), marque les objets vivants, et libere la memoire des objets non marques. Le LOH (Large Object Heap) gere les objets de plus de 85 000 octets separement.
3. Qu'est-ce que l'injection de dependances et comment fonctionne-t-elle dans ASP.NET Core ?
L'injection de dependances (DI) est un patron de conception ou les dependances sont fournies a une classe plutot que creees par celle-ci. ASP.NET Core integre un conteneur DI natif. On enregistre les services dans Program.cs avec trois durees de vie : Transient (nouvelle instance a chaque demande), Scoped (une instance par requete HTTP), Singleton (une seule instance pour toute l'application). Les dependances sont injectees via le constructeur. Cela facilite les tests unitaires (mocking), le decouplage et la maintenabilite du code.
4. Expliquez async/await en C# et les pieges courants.
async/await permet d'ecrire du code asynchrone de maniere lisible. Une methode async retourne Task ou Task
5. Quelle est la difference entre IEnumerable et IQueryable ?
IEnumerable
6. Comment fonctionne le pattern CQRS et quand l'utiliser ?
CQRS (Command Query Responsibility Segregation) separe les operations de lecture (Queries) et d'ecriture (Commands) en modeles distincts. Les Commands modifient l'etat et ne retournent rien. Les Queries retournent des donnees sans modifier l'etat. Avantages : optimisation independante des lectures et ecritures, scalabilite (bases de donnees separees possibles), modeles de lecture denormalises pour la performance. En .NET, souvent implemente avec MediatR. A utiliser pour les systemes complexes avec des besoins differents en lecture et ecriture. Eviter pour les CRUD simples ou cela ajoute de la complexite inutile.
7. Expliquez les middleware dans ASP.NET Core.
Les middleware sont des composants qui forment le pipeline de traitement des requetes HTTP. Chaque middleware peut traiter la requete, la passer au suivant, ou court-circuiter le pipeline. L'ordre d'enregistrement est crucial. Pipeline typique : gestion des exceptions, HSTS, redirection HTTPS, fichiers statiques, routage, CORS, authentification, autorisation, endpoints. On cree un middleware personnalise via une classe avec une methode InvokeAsync ou via app.Use() inline. Les middleware sont executes dans l'ordre pour la requete et en ordre inverse pour la reponse.
8. Qu'est-ce que Entity Framework Core et comment optimiser ses performances ?
EF Core est l'ORM officiel de Microsoft pour .NET. Il mappe les classes C# aux tables de base de donnees et traduit LINQ en SQL. Optimisations : utiliser AsNoTracking() pour les lectures seules, eviter le N+1 avec Include() et ThenInclude(), utiliser les projections (Select) pour ne charger que les colonnes necessaires, activer le split queries pour les grandes jointures, utiliser raw SQL ou des stored procedures pour les requetes complexes, configurer les index correctement, et utiliser le batching pour les insertions massives. Monitorer avec le logging SQL pour detecter les requetes lentes.
9. Quelle est la difference entre les types valeur et les types reference en C# ?
Les types valeur (int, float, bool, struct, enum) sont stockes sur la pile et contiennent directement la donnee. La copie duplique la valeur. Les types reference (class, string, array, delegate) sont stockes sur le tas avec une reference sur la pile. La copie duplique la reference, pas l'objet. Le boxing convertit un type valeur en reference (allocation heap), l'unboxing fait l'inverse. Les types valeur nullables (int?) ajoutent la capacite d'etre null. Comprendre cette distinction est essentiel pour la performance et eviter les bugs subtils.
10. Comment implementer la gestion des erreurs et le logging dans une application ASP.NET Core ?
Strategie en couches : middleware d'exception global pour capturer toutes les exceptions non gerees et retourner des reponses standardisees (ProblemDetails RFC 7807). Validation avec FluentValidation ou Data Annotations au niveau des controleurs. Try-catch cible uniquement pour les operations pouvant echouer de maniere previsible (appels externes, I/O). Pour le logging, utiliser ILogger