décembre 21, 2025
11 min de lecture

Questions d’entretien C#/.NET backend avec réponses

interview
career-advice
job-search
Questions d’entretien C#/.NET backend avec réponses
Milad Bonakdar

Milad Bonakdar

Auteur

Préparez vos entretiens backend C#/.NET avec des questions pratiques sur ASP.NET Core, EF Core, async, DI, API REST, tests et architecture.


Introduction

Pour un entretien backend C#/.NET, vous devez savoir expliquer comment construire des API avec ASP.NET Core, garder les accès base de données efficaces avec EF Core, utiliser l'async sans bloquer les threads et structurer les services avec l'injection de dépendances. Les bonnes réponses relient le concept à un vrai compromis backend : performance, fiabilité, testabilité ou maintenabilité.

Utilisez ce guide comme une checklist pratique. Relisez les réponses courtes, puis entraînez-vous à relier chacune d'elles à un exemple concret tiré d'un projet, d'un stage, d'un exercice technique ou d'un bug de production.


Fondamentaux du langage C#

1. Quelle est la différence entre struct et class en C# ?

Réponse :

  • Class : Un type référence (alloué sur le tas). Lorsque vous passez un objet class à une méthode, vous passez une référence à l'emplacement mémoire. Les modifications à l'intérieur de la méthode affectent l'objet original. Supporte l'héritage.
  • Struct : Un type valeur (alloué sur la pile). Lorsque vous passez une struct, une copie des données est passée. Les modifications à l'intérieur de la méthode n'affectent pas la struct originale. Ne supporte pas l'héritage (mais peut implémenter des interfaces).
  • Utilisation : Utilisez struct pour les petites structures de données immuables représentant une seule valeur (comme Point, Color). Utilisez class pour la plupart des autres objets.

Rareté : Courant Difficulté : Facile


2. Expliquez async et await. Comment cela aide-t-il à la scalabilité ?

Réponse : async et await permettent à une méthode de se suspendre pendant une opération d'E/S et de reprendre quand la Task se termine.

  • Mécanisme : await ne crée pas un nouveau thread. Pour une base de données, un fichier ou le réseau, il libère le thread de requête.
  • Scalabilité : Cela améliore le débit des endpoints ASP.NET Core liés aux E/S, mais ne rend pas le travail CPU plus rapide.
  • Conseil d'entretien : Mentionnez CancellationToken et les méthodes EF Core comme ToListAsync ou SaveChangesAsync pour les E/S base de données.

Rareté : Très courant Difficulté : Moyen


3. Qu'est-ce que l'Injection de Dépendances (DI) et comment est-elle implémentée dans .NET ?

Réponse : L'Injection de Dépendances est un patron de conception où les dépendances d'une classe sont fournies de l'extérieur plutôt que d'être créées en interne.

  • Dans .NET : ASP.NET Core a un conteneur DI intégré. Vous enregistrez les services dans Program.cs (ou Startup.cs dans les versions plus anciennes) et vous les injectez via l'injection de constructeur.
  • Durées de vie :
    • Transient : Créé à chaque fois qu'ils sont demandés.
    • Scoped : Créé une fois par requête client (requête HTTP).
    • Singleton : Créé la première fois qu'ils sont demandés et partagés par toutes les requêtes suivantes.

Rareté : Très courant Difficulté : Moyen


4. Quelle est la différence entre IEnumerable<T> et IQueryable<T> ?

Réponse :

  • IEnumerable<T> : Exécute la requête en mémoire. Si utilisé avec une base de données (EF Core), il récupère toutes les données du serveur vers la mémoire du client et ensuite les filtre. Bon pour LINQ to Objects.
  • IQueryable<T> : Exécute la requête à distance (par exemple, sur le serveur SQL). Il construit un arbre d'expressions qui est traduit en une requête SQL. Le filtrage se produit du côté de la base de données, ce qui est beaucoup plus efficace pour les grands ensembles de données.

Rareté : Courant Difficulté : Moyen


5. Que sont les Méthodes d'Extension ?

Réponse : Les méthodes d'extension vous permettent d'"ajouter" des méthodes aux types existants sans créer un nouveau type dérivé, recompiler ou modifier le type original d'une autre manière.

  • Syntaxe : Définies comme des méthodes statiques dans une classe statique. Le premier paramètre spécifie sur quel type la méthode opère, précédé du mot-clé this.
  • Exemple : Ajouter une méthode WordCount() à la classe string.

Rareté : Courant Difficulté : Facile


ASP.NET Core & Architecture

6. Qu'est-ce qu'un Middleware dans ASP.NET Core ?

Réponse : Les middlewares sont des composants logiciels qui sont assemblés dans un pipeline d'application pour traiter les requêtes et les réponses.

  • Pipeline : Chaque composant choisit de passer ou non la requête au composant suivant dans le pipeline et peut effectuer un travail avant et après l'invocation du composant suivant.
  • Exemples : Authentification, Autorisation, Journalisation, Gestion des exceptions, Service de fichiers statiques.
  • L'ordre compte : L'ordre dans lequel les middlewares sont ajoutés dans Program.cs définit l'ordre d'exécution.

Rareté : Très courant Difficulté : Moyen


7. Expliquez la différence entre .NET Core et .NET Framework.

Réponse :

  • .NET Framework : L'implémentation originale, uniquement pour Windows. Mature, mais liée à Windows.
  • .NET Core / .NET moderne : La lignée successeure multiplateforme et open source. Depuis .NET 5, la plateforme est généralement appelée simplement .NET; les versions actuelles incluent .NET 10 en LTS avec C# 14.
  • Différences clés : .NET moderne est le choix par défaut pour les nouvelles API backend grâce aux conteneurs Linux, aux versions côte à côte, aux fonctionnalités ASP.NET Core récentes et aux améliorations continues du runtime.

Rareté : Courant Difficulté : Facile


8. Qu'est-ce que Kestrel ?

Réponse : Kestrel est un serveur web multiplateforme, open-source et événementiel qui est inclus par défaut dans les modèles ASP.NET Core.

  • Rôle : Il écoute les requêtes HTTP et les transmet à l'application.
  • Utilisation : Il peut fonctionner de manière autonome (serveur de périphérie) ou derrière un proxy inverse comme IIS, Nginx ou Apache. L'utilisation d'un proxy inverse est recommandée pour la production afin de gérer la sécurité, l'équilibrage de charge et la terminaison SSL.

Rareté : Moyen Difficulté : Moyen


9. Comment gérez-vous la gestion globale des exceptions dans ASP.NET Core ?

Réponse : Au lieu de blocs try-catch dans chaque contrôleur, vous devriez utiliser un middleware pour la gestion globale des exceptions.

  • UseExceptionHandler : Middleware intégré qui intercepte les exceptions, les enregistre et réexécute la requête dans un pipeline alternatif (pointant généralement vers une page d'erreur ou une réponse API).
  • Middleware personnalisé : Vous pouvez écrire un middleware personnalisé pour intercepter les exceptions et renvoyer une réponse d'erreur JSON standardisée (par exemple, ProblemDetails).

Rareté : Courant Difficulté : Moyen


Base de données & Entity Framework

10. Qu'est-ce qu'Entity Framework Core (EF Core) ? Code-First vs. Database-First ?

Réponse : EF Core est un Object-Relational Mapper (ORM) pour .NET. Il permet aux développeurs de travailler avec une base de données en utilisant des objets .NET.

  • Code-First : Vous définissez d'abord vos classes de domaine (entités), et EF Core crée/met à jour le schéma de la base de données en fonction de celles-ci en utilisant Migrations. Préféré pour les nouveaux projets.
  • Database-First : Vous avez une base de données existante, et EF Core génère les classes .NET (scaffolding) en fonction du schéma.

Rareté : Courant Difficulté : Facile


11. Qu'est-ce que le problème N+1 dans EF Core et comment le corrigez-vous ?

Réponse : Le problème N+1 survient quand vous récupérez une liste d'entités, puis chargez une relation pour chaque élément dans une boucle, ce qui crée de nombreuses requêtes supplémentaires.

  • Correction : Chargez les relations explicitement avec Include, des includes filtrés, des projections ou un chargement explicite. Évitez le lazy loading dans les chemins critiques.
  • Exemple : await context.Orders.Include(o => o.Customer).ToListAsync();
  • Compromis : Avec plusieurs collections, envisagez les split queries ou les projections pour éviter la cartesian explosion et les colonnes inutiles.

Rareté : Très courant Difficulté : Moyen


12. Expliquez le patron Repository. Pourquoi l'utiliser avec EF Core ?

Réponse : Le patron Repository sert d'intermédiaire entre les couches de domaine et de mapping des données en utilisant une interface de type collection pour accéder aux objets de domaine.

  • Avantages : Découple l'application de la technologie d'accès aux données spécifique (EF Core), facilite les tests unitaires (peut simuler le repository) et centralise la logique d'accès aux données.
  • Inconvénients/Débat : Le DbContext d'EF Core est déjà une implémentation du patron Repository/Unit of Work. L'ajout d'une autre couche peut parfois être redondant ("abstraction sur abstraction").

Rareté : Courant Difficulté : Difficile


APIs REST & Services Web

13. Quelles sont les Verbes HTTP et leur utilisation typique ?

Réponse :

  • GET : Récupérer une ressource. Sûr et Idempotent.
  • POST : Créer une nouvelle ressource. Non Idempotent.
  • PUT : Mettre à jour/Remplacer une ressource existante. Idempotent.
  • PATCH : Mettre à jour partiellement une ressource. Pas nécessairement Idempotent (mais l'est généralement).
  • DELETE : Supprimer une ressource. Idempotent.

Rareté : Courant Difficulté : Facile

14. Quelle est la différence entre 401 Unauthorized et 403 Forbidden ?

Réponse :

  • 401 Unauthorized : L'utilisateur n'est pas authentifié. Le client doit se connecter et réessayer. "Je ne sais pas qui vous êtes."
  • 403 Forbidden : L'utilisateur est authentifié mais n'a pas la permission d'accéder à la ressource. "Je sais qui vous êtes, mais vous ne pouvez pas faire ça."

Rareté : Courant Difficulté : Facile


Tests & Bonnes Pratiques

15. Quelle est la différence entre les Tests Unitaires et les Tests d'Intégration ?

Réponse :

  • Tests Unitaires : Testent une petite unité de code (généralement une méthode) de manière isolée. Les dépendances sont simulées (en utilisant des outils comme Moq). Rapides et fiables.
  • Tests d'Intégration : Testent la façon dont différentes parties de l'application fonctionnent ensemble (par exemple, point de terminaison API + Base de données). Plus lents mais vérifient le comportement réel du système.

Rareté : Courant Difficulté : Facile


16. Comment simulez-vous les dépendances dans les Tests Unitaires ?

Réponse : Les frameworks de simulation comme Moq ou NSubstitute sont utilisés pour créer de fausses implémentations d'interfaces.

  • Objectif : Isoler la classe en cours de test. Par exemple, si vous testez un UserService, vous simulez le IUserRepository pour ne pas toucher à la vraie base de données.
  • Exemple (Moq) :
var mockRepo = new Mock<IUserRepository>();
mockRepo.Setup(repo => repo.GetById(1)).Returns(new User { Id = 1, Name = "Test" });
var service = new UserService(mockRepo.Object);

Rareté : Courant Difficulté : Moyen


17. Quels sont les principes SOLID ? Donnez un exemple de l'un d'eux.

Réponse : SOLID est un acronyme pour 5 principes de conception visant à rendre les logiciels plus compréhensibles, flexibles et maintenables.

  • Single Responsibility Principle (SRP) - Principe de responsabilité unique
  • Open/Closed Principle (OCP) - Principe ouvert/fermé
  • Liskov Substitution Principle (LSP) - Principe de substitution de Liskov
  • Interface Segregation Principle (ISP) - Principe de ségrégation des interfaces
  • Dependency Inversion Principle (DIP) - Principe d'inversion des dépendances
  • Exemple (DIP) : Les modules de haut niveau ne doivent pas dépendre des modules de bas niveau. Les deux doivent dépendre des abstractions. C'est la base de l'Injection de Dépendances.

Rareté : Courant Difficulté : Difficile


18. Qu'est-ce que le Boxing et l'Unboxing ? Pourquoi l'éviter ?

Réponse :

  • Boxing : Conversion d'un type valeur (comme int) en un type référence (object). Il alloue de la mémoire sur le tas.
  • Unboxing : Conversion du type référence en type valeur.
  • Performance : Les deux sont des opérations coûteuses (allocation de mémoire, vérification de type). Les génériques (List<T>) aident à éviter le boxing/unboxing par rapport aux anciennes collections (ArrayList).

Rareté : Courant Difficulté : Moyen


19. Qu'est-ce que l'instruction using en C# ?

Réponse : L'instruction using fournit une syntaxe pratique qui garantit l'utilisation correcte des objets IDisposable.

  • Mécanisme : Elle appelle automatiquement la méthode Dispose() sur l'objet lorsque le bloc est quitté (même si une exception se produit).
  • Syntaxe moderne : using var file = File.OpenRead("path"); (pas besoin d'accolades, disposé à la fin de la portée).

Rareté : Courant Difficulté : Facile


20. Expliquez le concept de Middleware dans le contexte du patron "Chaîne de Responsabilité".

Réponse : Le Middleware ASP.NET Core est une implémentation classique du patron Chaîne de Responsabilité.

  • Patron : Une requête est transmise le long d'une chaîne de gestionnaires. Chaque gestionnaire décide soit de traiter la requête, soit de la transmettre au gestionnaire suivant dans la chaîne.
  • Application : Dans .NET, le RequestDelegate représente le gestionnaire suivant. Les composants middleware sont enchaînés pour former le pipeline de requête.

Rareté : Rare Difficulté : Difficile

Newsletter subscription

Conseils de carrière hebdomadaires qui fonctionnent vraiment

Recevez les dernières idées directement dans votre boîte de réception

Créez un CV qui Vous Fait Embaucher 60% Plus Vite

En quelques minutes, créez un CV personnalisé et compatible ATS qui a prouvé obtenir 6 fois plus d'entretiens.

Créer un meilleur CV

Partager cet article

Battez le Taux de Rejet ATS de 75%

3 CV sur 4 n'atteignent jamais un œil humain. Notre optimisation des mots-clés augmente votre taux de réussite jusqu'à 80%, garantissant que les recruteurs voient réellement votre potentiel.