décembre 21, 2025
11 min de lecture

Questions d'entretien pour développeur back-end (C#/.NET) : Guide complet

interview
career-advice
job-search
Questions d'entretien pour développeur back-end (C#/.NET) : Guide complet
Milad Bonakdar

Milad Bonakdar

Auteur

Maîtrisez le développement back-end en C# et .NET grâce à des questions d'entretien essentielles couvrant ASP.NET Core, Entity Framework, l'injection de dépendances et la conception de systèmes.


Introduction

C# et .NET ont considérablement évolué, devenant un écosystème puissant et multiplateforme pour la construction de systèmes backend haute performance. Avec l'avènement de .NET Core (et maintenant simplement .NET 5+), c'est un choix de premier plan pour les applications cloud-native, les microservices et les solutions d'entreprise.

Ce guide couvre les questions d'entretien essentielles pour les développeurs Backend spécialisés dans C# et .NET. Nous explorons les fondamentaux du langage, l'architecture ASP.NET Core, les interactions avec la base de données via Entity Framework et les meilleures pratiques pour vous aider à préparer votre prochain entretien.


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 sont des mots-clés utilisés pour la programmation asynchrone.

  • Mécanisme : Lorsqu'un mot-clé await est rencontré, l'exécution de la méthode est mise en pause, et le thread est renvoyé au pool de threads pour gérer d'autres requêtes. Lorsque la tâche attendue est terminée, l'exécution reprend (potentiellement sur un thread différent).
  • Scalabilité : Dans un serveur web (comme Kestrel), les threads sont une ressource limitée. Si un thread se bloque en attendant une E/S (base de données, réseau), il ne peut pas gérer d'autres requêtes. Async permet au serveur de gérer beaucoup plus de requêtes simultanées avec moins de threads en ne les bloquant pas pendant les opérations d'E/S.

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é à Windows.
  • .NET Core (maintenant simplement .NET) : Une implémentation multiplateforme, open-source et modulaire. Il fonctionne sur Windows, Linux et macOS. Il est optimisé pour les hautes performances et les déploiements cloud.
  • Différences clés : Support multiplateforme, architecture de microservices conviviale, performances supérieures, gestion des versions côte à côte.

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 se produit lorsque vous récupérez une liste d'entités (1 requête) et que vous accédez ensuite à une entité liée pour chaque élément dans une boucle, ce qui entraîne N requêtes supplémentaires.

  • Correction : Utilisez le Chargement anticipé avec la méthode .Include(). Cela génère un JOIN SQL pour récupérer les données liées en une seule requête.
  • Exemple : context.Orders.Include(o => o.Customer).ToList();

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.