samedi 13 août 2022

20 questions techniques courantes pour un entretien de développeur senior C# / .NET



🔷 1. Quelle est la différence entre Task et Thread ?

Réponse :
Thread crée un nouveau thread du système, alors que Task utilise le thread pool, plus léger. Task est mieux adapté pour les opérations asynchrones, tandis que Thread donne plus de contrôle (priorité, état…).


🔷 2. Quelle est la différence entre IEnumerable, IQueryable et List ?

Réponse :

  • IEnumerable : exécution côté mémoire, LINQ to Objects.

  • IQueryable : exécution différée et traduite (ex. SQL via Entity Framework).

  • List : collection concrète avec accès direct aux éléments.


🔷 3. Que fait le mot-clé using en C# ?

Réponse :
Il peut :

  1. Déclarer un bloc qui appelle Dispose() automatiquement (pattern IDisposable),

  2. Importer des espaces de noms (using System;).


🔷 4. Quelle est la différence entre ref et out ?

Réponse :

  • ref : la variable doit être initialisée avant d’être passée.

  • out : la variable doit être assignée dans la méthode appelée.


🔷 5. Quelle est la différence entre une classe abstraite et une interface ?

Réponse :

  • Classe abstraite : peut contenir de la logique partagée.

  • Interface : uniquement des signatures jusqu’en C# 8, depuis C# 8, on peut avoir des méthodes par défaut.


🔷 6. Explique async / await.

Réponse :
Ils permettent l’asynchronisme sans bloquer les threads.
async marque une méthode asynchrone. await attend le résultat sans bloquer.


🔷 7. Quelle est la différence entre == et Equals() ?

Réponse :

  • == : peut être surchargé (valeurs ou références).

  • Equals() : méthode virtuelle de Object, peut être redéfinie pour comparer les contenus.


🔷 8. Qu’est-ce que le garbage collector ? Peut-on le forcer ?

Réponse :
Le GC libère automatiquement la mémoire des objets non référencés.
On peut forcer via GC.Collect(), mais ce n’est pas recommandé sauf cas extrême (grande libération mémoire manuelle).


🔷 9. Quelle est la différence entre finalize et dispose ?

Réponse :

  • Dispose() : appelé explicitement pour libérer des ressources managées et non managées.

  • Finalize() : méthode de nettoyage automatique appelée par le GC (via destructeur).


🔷 10. Comment fonctionne le lock en C# ?

Réponse :
lock(obj) garantit qu’un seul thread accède à un bloc de code à la fois. Utilisé pour éviter les conditions de course.


🔷 11. Différence entre value type et reference type ?

Réponse :

  • value type (structs, int, double) : stocké dans la stack, copie complète.

  • reference type (class, arrays) : stocké dans le heap, copie de la référence.


🔷 12. À quoi sert le yield return ?

Réponse :
Permet de créer un itérateur paresseux (lazy enumeration). Évite de construire toute la collection en mémoire.


🔷 13. Quelle est la différence entre abstract, virtual, et override ?

Réponse :

  • abstract : méthode sans corps, obligatoire à implémenter.

  • virtual : avec corps, peut être surchargée.

  • override : surcharge d'une méthode virtual ou abstract.


🔷 14. Qu’est-ce que le Dependency Injection (DI) ?

Réponse :
Technique consistant à injecter les dépendances (services, objets) plutôt que les créer directement. Favorise le test unitaire et la modularité.


🔷 15. Qu’est-ce qu’un delegate ?

Réponse :
Un type qui représente une référence à une méthode. Utilisé pour les événements ou les callbacks.


🔷 16. Que sont les Func<>, Action<> et Predicate<> ?

Réponse :

  • Func<T, TResult> : méthode qui retourne une valeur.

  • Action<T> : méthode sans retour.

  • Predicate<T> : méthode qui retourne bool.


🔷 17. Comment sécuriser une application ASP.NET Core ?

Réponse :

  • Authentification (JWT, Cookies, OAuth).

  • Autorisation via [Authorize], rôles, claims.

  • Validation des entrées.

  • Protection contre XSS, CSRF.

  • Utilisation de HTTPS et app.UseHsts().


🔷 18. Explique le pattern Repository + Unit of Work.

Réponse :

  • Repository : abstraction de l'accès aux données.

  • Unit of Work : coordonne les transactions pour regrouper plusieurs opérations en une seule.


🔷 19. Différence entre String, StringBuilder, ReadOnlySpan<char> ?

Réponse :

  • String : immutable.

  • StringBuilder : modifiable, performant pour concaténation.

  • ReadOnlySpan<char> : accès performant sans allocation (slicing, substrings).


🔷 20. Comment améliorer la performance d'une application C# ?

Réponse :

  • Réduire les allocations (éviter new inutiles).

  • Utiliser Span<T>, ArrayPool.

  • Optimiser LINQ (éviter ToList() inutiles).

  • Utiliser la mise en cache, async/await, ConfigureAwait(false), etc.



Aucun commentaire:

Enregistrer un commentaire