1. Quelle est la différence entre var
, dynamic
et object
en C# ?
✅ Réponse :
Type | Résolution du type | Vérification à la compilation | Performance |
---|---|---|---|
var |
Déterminé au moment de la compilation | ✅ Oui | Rapide |
dynamic |
Déterminé au runtime | ❌ Non | Moins performant |
object |
Type générique, conversion explicite nécessaire | ✅ Oui | Variable |
var x = 10; // int, type connu à la compilation
dynamic y = 10; // Peut changer de type à l'exécution
object z = 10; // Type connu, mais nécessite un cast pour les opérations spécifiques
🚀 Bonnes pratiques :
-
var
est recommandé lorsque le type est évident. -
dynamic
doit être utilisé avec précaution (interop COM, JSON, Reflection). -
object
est utile pour manipuler des types génériques.
2. Explique la différence entre const
, readonly
et static
en C# ?
✅ Réponse :
Modificateur | Valeur modifiable ? | Portée |
---|---|---|
const |
❌ Non (fixée à la compilation) | Accessible sans instance |
readonly |
✅ Oui (modifiable dans le constructeur) | Instance spécifique |
static |
✅ Oui (modifiable dans la classe) | Partagée entre toutes les instances |
const double Pi = 3.14; // Fixe, ne peut pas changer
readonly int age; // Peut être assigné dans le constructeur
static int compteur; // Partagé entre toutes les instances de la classe
3. Qu’est-ce qu’un delegate
en C# et comment l’utiliser ?
✅ Réponse :
Un delegate est un type qui référence une méthode et permet d’appeler dynamiquement des méthodes.
delegate void MonDelegate(string message);
void AfficherMessage(string msg) => Console.WriteLine(msg);
MonDelegate del = AfficherMessage;
del("Hello, C#!"); // Appelle la méthode AfficherMessage
🚀 Utilisations :
-
Passer des fonctions en paramètre.
-
Implémenter des événements (
event
). -
Encapsuler des méthodes anonymes (
Func<>
,Action<>
).
4. Quelle est la différence entre Func<>
, Action<>
et Predicate<>
?
✅ Réponse :
Type | Retourne une valeur ? | Paramètres | Exemple |
---|---|---|---|
Func<T, TResult> |
✅ Oui | 0 à 16 | Func<int, int> f = x => x * 2; |
Action<T> |
❌ Non | 0 à 16 | Action<string> a = Console.WriteLine; |
Predicate<T> |
✅ Oui (bool) | 1 | Predicate<int> p = x => x > 0; |
Func<int, int> doubler = x => x * 2;
Console.WriteLine(doubler(5)); // 10
Action<string> afficher = Console.WriteLine;
afficher("Hello!");
Predicate<int> estPair = x => x % 2 == 0;
Console.WriteLine(estPair(4)); // True
5. Explique la différence entre Equals()
, ==
et ReferenceEquals()
en C# ?
✅ Réponse :
-
==
: Compare les valeurs pour les types primitifs et les références pour les objets. -
Equals()
: Compare le contenu de l’objet (peut être redéfini). -
ReferenceEquals()
: Compare les références mémoire (vérifie si deux objets sont identiques).
string a = "hello";
string b = "hello";
Console.WriteLine(a == b); // True (comparaison de valeurs)
Console.WriteLine(a.Equals(b)); // True (comparaison de contenu)
Console.WriteLine(ReferenceEquals(a, b)); // False (références différentes)
6. Qu'est-ce que le Dependency Injection
et pourquoi l'utiliser ?
✅ Réponse :
L’Injection de Dépendances (DI) est un design pattern permettant de découpler les composants et d’améliorer la maintenabilité du code.
// Mauvais couplage (dépendance forte)
class Service
{
private Repository repo = new Repository(); // Problème : instancié directement
}
// Injection de dépendance via le constructeur
class Service
{
private readonly IRepository _repo;
public Service(IRepository repo) { _repo = repo; }
}
🚀 Avantages :
-
Facilite les tests unitaires.
-
Favorise l’extensibilité du code.
-
Compatible avec ASP.NET Core DI Container (
IServiceCollection
).
7. Quelle est la différence entre Select()
, Where()
et FirstOrDefault()
en LINQ ?
✅ Réponse :
Méthode | Fonction | Exemple |
---|---|---|
Select() |
Transforme les données | users.Select(u => u.Name) |
Where() |
Filtre les résultats | users.Where(u => u.Age > 18) |
FirstOrDefault() |
Récupère le 1er élément ou null |
users.FirstOrDefault(u => u.Age > 18) |
var noms = users.Select(u => u.Name);
var adultes = users.Where(u => u.Age > 18);
var premier = users.FirstOrDefault(u => u.Age > 18);
8. Comment gérer les deadlocks en programmation multithread en C# ?
✅ Réponse :
Un deadlock se produit quand deux threads se bloquent mutuellement en attendant une ressource.
🚀 Solutions :
-
Toujours verrouiller les objets dans le même ordre.
-
Utiliser
Monitor.TryEnter()
au lieu delock
. -
Utiliser
SemaphoreSlim
au lieu delock
pour les threads asynchrones.
lock (obj1)
{
lock (obj2) { /* Risque de deadlock */ }
}
// Prévention avec `TryEnter()`
if (Monitor.TryEnter(obj1, TimeSpan.FromSeconds(1)))
{
try { /* Travail sécurisé */ }
finally { Monitor.Exit(obj1); }
}
9. Comment fonctionne le Lazy<T>
en C# ?
✅ Réponse :
Lazy<T>
permet de différer l’instanciation d’un objet jusqu’à sa première utilisation.
Lazy<DatabaseConnection> db = new Lazy<DatabaseConnection>(() => new DatabaseConnection());
var connection = db.Value; // L'objet est instancié ici
🚀 Avantages :
-
Optimise la consommation mémoire.
-
Améliore la performance au démarrage.
10. Comment créer un Singleton
thread-safe en C# ?
✅ Réponse :
public class Singleton
{
private static readonly Lazy<Singleton> instance = new(() => new Singleton());
private Singleton() { }
public static Singleton Instance => instance.Value;
}
🚀 Pourquoi utiliser Lazy<T>
?
-
Thread-safe par défaut.
-
Instanciation différée (évite les objets inutiles).
Aucun commentaire:
Enregistrer un commentaire