🔷 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 :
-
Déclarer un bloc qui appelle
Dispose()
automatiquement (patternIDisposable
), -
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 deObject
, 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éthodevirtual
ouabstract
.
🔷 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 retournebool
.
🔷 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