mardi 2 septembre 2025

Questions Answers C#

Return 


đŸ”č C# – Questions / RĂ©ponses Techniques

1. Différence entre struct et class ?

  • class : type rĂ©fĂ©rence, stockĂ© sur le heap, supporte hĂ©ritage, peut avoir un constructeur par dĂ©faut, destructeur, mĂ©thodes virtuelles.

  • struct : type valeur, stockĂ© sur la stack (sauf si contenu dans un objet), pas d’hĂ©ritage (sauf interfaces), utilisĂ© pour des petits objets lĂ©gers.


2. Différence entre abstract class et interface ?

  • abstract class : peut contenir de l’implĂ©mentation + des membres abstraits, un seul hĂ©ritage possible.

  • interface : dĂ©finit uniquement un contrat (pas d’implĂ©mentation avant C# 8, depuis on peut avoir des default implementations), multi-implĂ©mentation possible.


3. Différence entre IEnumerable, ICollection, IList ?

  • IEnumerable<T> : permet l’itĂ©ration (foreach), lecture seule.

  • ICollection<T> : hĂ©rite de IEnumerable, ajoute Count, Add, Remove.

  • IList<T> : hĂ©rite de ICollection, accĂšs par index.


4. Différence entre Array et List<T> ?

  • Array : taille fixe, plus performant pour accĂšs direct, allocation contiguĂ«.

  • List<T> : taille dynamique, mĂ©thodes pratiques (Add, Remove, Contains).


5. Différence entre Dispose() et Finalize() ?

  • Dispose() : mĂ©thode explicite (via IDisposable), nettoyage manuel, appelĂ© par le dĂ©veloppeur (using).

  • Finalize() : appelĂ© par le GC avant destruction d’un objet, non dĂ©terministe, coĂ»teux.


6. Différence entre ref, out, in ?

  • ref : passage par rĂ©fĂ©rence, la variable doit ĂȘtre initialisĂ©e avant l’appel.

  • out : passage par rĂ©fĂ©rence, mais la variable doit ĂȘtre initialisĂ©e dans la mĂ©thode appelĂ©e.

  • in : passage par rĂ©fĂ©rence en lecture seule (C# 7.2+).


7. Différence entre Task, Thread, async/await ?

  • Thread : unitĂ© d’exĂ©cution bas-niveau.

  • Task : abstraction de travail asynchrone (utilise le ThreadPool).

  • async/await : simplifie la programmation asynchrone (transforme du code asynchrone en code lisible sĂ©quentiel).


8. Différence entre lock, Monitor, Mutex, Semaphore ?

  • lock : simplification de Monitor.Enter/Exit, utilisĂ© pour la synchronisation intra-processus.

  • Monitor : plus flexible que lock (TryEnter, Wait, Pulse).

  • Mutex : synchronisation inter-processus.

  • Semaphore : contrĂŽle le nombre de threads simultanĂ©s.


9. Qu’est-ce que le boxing et unboxing ?

  • Boxing : conversion d’un type valeur (int) en type rĂ©fĂ©rence (object).

  • Unboxing : conversion inverse.
    ⚠️ CoĂ»teux en performance.


10. Différence entre string, StringBuilder ?

  • string : immuable (chaque modification crĂ©e une nouvelle instance).

  • StringBuilder : mutable, optimisĂ© pour les concatĂ©nations multiples.


11. Qu’est-ce que le Garbage Collector (GC) en .NET ?

  • GĂšre la mĂ©moire automatiquement.

  • Fonctionne en gĂ©nĂ©rations (0, 1, 2).

  • Nettoie les objets non rĂ©fĂ©rencĂ©s.

  • Peut ĂȘtre forcĂ© avec GC.Collect() (⚠️ dĂ©conseillĂ© sauf cas spĂ©cifiques).


12. Différence entre public, private, protected, internal, protected internal ?

  • public : accessible partout.

  • private : accessible uniquement dans la classe.

  • protected : accessible dans la classe + classes dĂ©rivĂ©es.

  • internal : accessible dans le mĂȘme assembly.

  • protected internal : accessible dans assembly + classes dĂ©rivĂ©es.

  • private protected (C# 7.2+) : accessible uniquement dans la mĂȘme classe + classes dĂ©rivĂ©es dans le mĂȘme assembly.


13. Différence entre Equals() et == ?

  • == : opĂ©rateur, peut ĂȘtre surchargĂ©, par dĂ©faut compare les rĂ©fĂ©rences.

  • Equals() : mĂ©thode virtuelle, compare l’Ă©galitĂ© logique (peut ĂȘtre redĂ©finie).


14. Différence entre ValueType et ReferenceType ?

  • ValueType : stack, copie par valeur, contient directement la donnĂ©e (int, struct).

  • ReferenceType : heap, copie par rĂ©fĂ©rence (class, string).


15. Qu’est-ce que LINQ ?

  • Langage intĂ©grĂ© aux objets (Language Integrated Query).

  • Permet d’Ă©crire des requĂȘtes (SQL-like) sur des collections (List<T>, IEnumerable, Entity Framework).





đŸ”č Exercices C# en Entretien

1. Quelle est la sortie du code suivant ?

int a = 10;
int b = a;
b++;
Console.WriteLine(a);
Console.WriteLine(b);

✅ RĂ©ponse :

10
11

👉 Parce que int est un type valeur : la copie est indĂ©pendante.


2. Et avec des objets (référence) ?

class Person { public string Name; }

var p1 = new Person { Name = "Alice" };
var p2 = p1;
p2.Name = "Bob";

Console.WriteLine(p1.Name);

✅ RĂ©ponse :

Bob

👉 class est un type rĂ©fĂ©rence, p1 et p2 pointent sur le mĂȘme objet.


3. Quelle est la différence entre ces deux comparaisons ?

string s1 = "hello";
string s2 = "hello";
Console.WriteLine(s1 == s2);
Console.WriteLine(object.ReferenceEquals(s1, s2));

✅ RĂ©ponse :

True
True

👉 Les littĂ©raux string sont mis en cache (interning).
⚠️ Si s2 venait de new string("hello"), alors ReferenceEquals serait False.


4. Différence entre Task.Run et Thread ?

Task.Run(() => Console.WriteLine("Task"));
new Thread(() => Console.WriteLine("Thread")).Start();

✅ RĂ©ponse attendue :

  • Task.Run utilise le ThreadPool (rĂ©utilisation des threads).

  • Thread crĂ©e un nouveau thread (plus coĂ»teux).


5. Utilisation de async/await : que va afficher ce code ?

async Task<string> GetDataAsync()
{
    await Task.Delay(1000);
    return "Done";
}

var task = GetDataAsync();
Console.WriteLine("Before await");
Console.WriteLine(await task);
Console.WriteLine("After await");

✅ RĂ©ponse (ordre exact d’affichage) :

Before await
Done
After await

6. Corriger ce code (éviter NullReferenceException) :

string? input = null;
Console.WriteLine(input.Length);

✅ RĂ©ponse : utiliser l’opĂ©rateur ? :

Console.WriteLine(input?.Length ?? 0);

7. Que va afficher ce code ?

List<int> numbers = new List<int> { 1, 2, 3 };
foreach (var n in numbers)
{
    numbers.Add(4); // Erreur ?
}

✅ RĂ©ponse :

  • Ce code lĂšvera InvalidOperationException.
    👉 Car on ne peut pas modifier une collection pendant une itĂ©ration.


8. LINQ – Que va retourner ce code ?

var data = new List<int> { 1, 2, 3, 4, 5 };
var result = data.Where(x => x % 2 == 0).Select(x => x * 10).ToList();

✅ RĂ©ponse :

{ 20, 40 }

9. Que fait ce code avec lock ?

private static readonly object _locker = new object();

lock (_locker)
{
    // Critical section
}

✅ RĂ©ponse :

  • EmpĂȘche que plusieurs threads exĂ©cutent ce bloc en mĂȘme temps.

  • Évite les problĂšmes de race condition.


10. Qu’affiche ce code ?

var numbers = new int[] { 1, 2, 3 };
var query = numbers.Select(x => x * 2);

numbers[0] = 10;

foreach (var n in query)
    Console.WriteLine(n);

✅ RĂ©ponse :

20
4
6

👉 LINQ est diffĂ©rĂ© (deferred execution) : l’Ă©valuation se fait au moment du foreach, pas Ă  la dĂ©claration.



Aucun commentaire:

Enregistrer un commentaire

Questions Answers C# LÆ°á»Łt xem: