đč 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 desdefault 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 deIEnumerable, ajouteCount,Add,Remove. -
IList<T>: hérite deICollection, 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 (viaIDisposable), 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 deMonitor.Enter/Exit, utilisé pour la synchronisation intra-processus. -
Monitor: plus flexible quelock(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.Runutilise le ThreadPool (réutilisation des threads). -
Threadcré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