🟣
Intermediaire 20 questions C#

Questions C# et .NET

20 questions C#/.NET pour les entretiens. LINQ, async/await, dependency injection, Entity Framework et ASP.NET Core.

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). Les structs sont copiees par valeur lors de l'affectation. Utilisez une struct pour des petits objets immuables (Point, Color, DateTime). Utilisez une classe pour des objets complexes avec un comportement riche. Les structs evitent la pression sur le garbage collector car elles ne necessitent pas d'allocation heap.

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. Le mot-cle await suspend l'execution jusqu'a la completion de la tache sans bloquer le thread. Pieges courants : async void (a eviter sauf pour les event handlers car les exceptions ne sont pas capturees), deadlock en appelant .Result ou .Wait() dans un contexte de synchronisation, oublier await (la tache s'execute mais les erreurs sont perdues), et le ConfigureAwait(false) necessaire dans les bibliotheques pour eviter la capture du contexte de synchronisation.

5. Quelle est la difference entre IEnumerable et IQueryable ?

IEnumerable travaille en memoire (LINQ to Objects). Le filtrage s'execute cote client apres avoir charge toutes les donnees. IQueryable traduit les expressions LINQ en requetes (ex: SQL via Entity Framework). Le filtrage s'execute cote serveur, ne ramenant que les donnees necessaires. Utilisez IQueryable quand vous travaillez avec une source de donnees externe (base de donnees) pour optimiser les performances. Utilisez IEnumerable pour les collections en memoire. Attention : materialiser un IQueryable trop tot avec ToList() annule l'avantage du filtrage cote serveur.

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 natif avec des fournisseurs comme Serilog ou NLog. Configurer le logging structure (JSON) avec des niveaux (Debug, Info, Warning, Error, Critical). Centraliser les logs avec ELK Stack, Seq, ou Application Insights pour le monitoring en production.

Besoin d'aide pour preparer vos entretiens ?

Decrivez votre profil pour des conseils de preparation personnalises.

Recevoir des conseils

Questions frequentes

C# est-il demande en France ?
Oui, surtout dans l'industrie, la finance et le jeu video (Unity). .NET est tres utilise en entreprise.

Pages liees

Chaque semaine, le meilleur de la tech francaise

Tendances, salaires, outils et opportunites — directement dans votre boite mail.

Gratuit. Desabonnement en un clic. Pas de spam.