mercredi 3 avril 2024

questions techniques C#.Net



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 de lock.

  • Utiliser SemaphoreSlim au lieu de lock 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