Comment réussir un entretien C# : principales questions et réponses
Un entretien pour un poste de développeur C# / .NET ne consiste pas seulement à vérifier les connaissances techniques, mais aussi la capacité à réfléchir et à expliquer des concepts complexes en termes simples. Dans cet article, nous avons analysé les questions les plus fréquentes posées lors des entretiens, avec des exemples de code et des explications. Ce contenu sera utile aussi bien aux développeurs junior qu'aux développeurs middle.
1. Quelle est la différence entre les value types et les reference types ?
C'est une question basique mais importante. En C#, tous les types sont divisés en deux catégories :
- Value types (types de valeur) — stockés dans la pile (stack), copiés lors de l'affectation. Exemples :
int,double,struct,enum. - Reference types (types de référence) — stockés dans le tas (heap), la variable contient une référence vers l'objet. Exemples :
class,string,array,delegate.
Exemple pour l'entretien :
int a = 10;
int b = a;
b = 20;
Console.WriteLine(a); // 10 — la valeur n'a pas changé
var obj1 = new MyClass { Value = 10 };
var obj2 = obj1;
obj2.Value = 20;
Console.WriteLine(obj1.Value); // 20 — la référence est la même
Lors de l'entretien, on demande aussi souvent à propos du boxing/unboxing — la conversion d'un value type en object et vice versa. Essayez d'éviter cela dans le code, car cela réduit les performances.
2. Que sont les délégués, les événements et les expressions lambda ?
Les délégués sont des types qui stockent des références vers des méthodes. Les événements sont une couche d'abstraction au-dessus des délégués, utilisée pour implémenter le modèle "éditeur-abonné".
Exemple de délégué :
public delegate void MyDelegate(string message);
public static void ShowMessage(string msg) => Console.WriteLine(msg);
MyDelegate del = ShowMessage;
del("Hello from delegate");
Exemple d'événement :
public class Button
{
public event EventHandler Click;
public void Press() => Click?.Invoke(this, EventArgs.Empty);
}
Les expressions lambda sont une notation courte pour les méthodes anonymes. Elles sont activement utilisées dans LINQ :
var numbers = new List<int> { 1, 2, 3, 4, 5 };
var even = numbers.Where(x => x % 2 == 0).ToList();
Lors de l'entretien, on peut demander : "Pourquoi est-il préférable d'utiliser des événements plutôt que des délégués ?" — réponse : les événements protègent la liste des abonnés contre les modifications externes (on ne peut pas appeler Invoke de l'extérieur).
3. Comment fonctionne async/await et quelle est la différence avec le multithreading ?
C'est l'une des questions les plus populaires. async/await est un sucre syntaxique pour travailler avec des opérations asynchrones. Il ne crée pas un nouveau thread, mais utilise efficacement celui existant (thread UI ou thread du pool).
Points clés :
async— modificateur de méthode qui autorise l'utilisation deawait.await— suspend l'exécution de la méthode jusqu'à la fin de la tâche, sans bloquer le thread.- Le type de retour est généralement
TaskouTask<T>.
Exemple :
public async Task<string> GetDataAsync()
{
using var client = new HttpClient();
string result = await client.GetStringAsync("https://api.example.com");
return result;
}
Différence avec le multithreading : le multithreading (Thread, Task.Run) est l'exécution parallèle de code sur plusieurs cœurs CPU. Async/await est une asynchronie qui libère le thread pour d'autres tâches pendant l'attente (par exemple, d'une réponse du serveur).
Conseil : lors de l'entretien, donnez un exemple concret — le chargement de données depuis le réseau ou un fichier. Évitez async void (sauf pour les gestionnaires d'événements) — cela peut entraîner des exceptions non gérées.