1. Les bases du langage C#
-
Différence entre
classetstruct -
Différence entre
abstract classetinterface -
Que veut dire
sealed,virtual,override,new? -
Qu’est-ce qu’un
delegateet unevent? -
Différence entre
IEnumerable,ICollection,IList -
Différence entre
refetout
2. La gestion mémoire et runtime
-
Qu’est-ce que le Garbage Collector ?
-
Qu’est-ce qu’un boxing/unboxing ?
-
Différence entre Value type et Reference type
-
Qu’est-ce que le
using(pourIDisposable) ?
3. Programmation objet et avancée
-
Explique le concept d’héritage multiple et comment C# le gère
-
Polymorphisme (compile-time vs run-time)
-
Différence entre
Task,Threadetasync/await -
Qu’est-ce que le LINQ et peux-tu donner un exemple ?
4. ASP.NET et services (si applicable)
-
Cycle de vie d’une requête HTTP dans ASP.NET
-
Différence entre Web API et WCF
-
Qu’est-ce que l’injection de dépendances (DI) ?
-
Qu’est-ce qu’un middleware ?
5. SQL et Data Access
-
Différence entre Entity Framework et ADO.NET
-
Qu’est-ce qu’un
DbContext? -
Comment optimiser une requête LINQ to SQL ?
6. Questions pratiques (souvent posées)
👉 Exemple :
public class A
{
public virtual void Print() => Console.WriteLine("A");
}
public class B : A
{
public override void Print() => Console.WriteLine("B");
}
public class C : A
{
public new void Print() => Console.WriteLine("C");
}
static void Main()
{
A a1 = new B();
A a2 = new C();
a1.Print();
a2.Print();
}
Question : Quelle est la sortie ?
(Réponse : B puis A car new masque la méthode et ne la remplace pas au runtime.)
🔹 Questions & Réponses C#.NET
1. Quelle est la différence entre une classe et une struct en C# ?
-
Classe : type référence → stockée sur le heap, passée par référence, supporte héritage, polymorphisme,
null. -
Struct : type valeur → stockée sur la stack (sauf si contenue dans une classe), copiée par valeur, pas d’héritage (sauf implémentation d’interfaces), ne peut pas être
nullsauf siNullable<T>.
👉 Exemple :
struct Point { public int X; public int Y; }
class Person { public string Name; }
2. Différence entre abstract class et interface ?
-
Abstract class : peut contenir implémentation + membres abstraits, peut avoir champs, propriétés, méthodes protégées, constructeur. Une classe ne peut hériter que d’une seule classe abstraite.
-
Interface : contrat pur, pas d’implémentation (sauf depuis C# 8 avec
default implementations). Une classe peut implémenter plusieurs interfaces.
👉 Exemple :
abstract class Animal { public abstract void MakeSound(); }
interface IWalk { void Walk(); }
3. Que font les mots-clés sealed, virtual, override, new ?
-
virtual→ méthode peut être surchargée dans une classe dérivée. -
override→ redéfinit une méthodevirtualouabstract. -
sealed→ empêche une classe d’être héritée OU empêche une méthode d’être redéfinie. -
new→ masque une méthode de la classe de base mais ne la remplace pas au runtime.
4. Différence entre ref et out ?
-
ref: variable doit être initialisée avant d’être passée. -
out: variable doit être assignée dans la méthode avant de sortir.
👉 Exemple :
void TestRef(ref int x) { x += 10; }
void TestOut(out int y) { y = 20; }
5. Qu’est-ce qu’un delegate et un event ?
-
Delegate : type qui référence une méthode (comme un pointeur de fonction).
-
Event : mécanisme basé sur delegate, mais avec des restrictions d’accès (seul le déclarant peut déclencher l’événement).
👉 Exemple :
public delegate void Notify(string msg);
public event Notify OnNotify;
6. Qu’est-ce que le Garbage Collector ?
C’est le mécanisme de .NET qui libère automatiquement la mémoire des objets non utilisés.
Il fonctionne par générations (0, 1, 2) pour optimiser les performances.
7. Différence entre boxing et unboxing ?
-
Boxing : conversion d’un type valeur (
int) en type référence (object). -
Unboxing : conversion inverse.
👉 Exemple :
int x = 42;
object obj = x; // boxing
int y = (int)obj; // unboxing
8. Différence entre IEnumerable, ICollection, IList ?
-
IEnumerable<T>→ permet uniquement de parcourir la collection (foreach). -
ICollection<T>→ hérite deIEnumerable<T>, ajoute Count,Add,Remove. -
IList<T>→ hérite deICollection<T>, ajoute accès par index.
9. Différence entre Task, Thread et async/await ?
-
Thread : unité d’exécution bas niveau, gérée par l’OS.
-
Task : abstraction plus haut niveau, représente un travail asynchrone.
-
async/await : simplifie l’écriture du code asynchrone basé sur
Task.
👉 Exemple :
async Task<int> GetDataAsync() {
await Task.Delay(1000);
return 42;
}
10. Qu’est-ce que LINQ ?
Language Integrated Query → permet d’écrire des requêtes sur collections, objets, XML, BD en syntaxe intégrée au C#.
👉 Exemple :
var numbers = new[] { 1, 2, 3, 4, 5 };
var evens = numbers.Where(n => n % 2 == 0).ToList(); // {2,4}
11. Différence entre Web API et WCF ?
-
WCF : framework plus ancien, supporte SOAP, TCP, HTTP, MSMQ, nécessite configuration lourde.
-
Web API : basé sur HTTP/REST, léger, simple, optimisé pour JSON/REST.
12. Qu’est-ce que l’injection de dépendances (DI) ?
Technique qui consiste à fournir les dépendances d’une classe depuis l’extérieur plutôt que de les créer à l’intérieur.
👉 Favorise le découplage et le test unitaire.
13. Qu’est-ce qu’un middleware (ASP.NET Core) ?
C’est un composant de la pipeline HTTP qui traite la requête/réponse.
Exemple de middlewares : authentification, logging, CORS.
14. Différence entre Entity Framework et ADO.NET ?
-
ADO.NET : bas niveau, requêtes SQL manuelles, gestion explicite des
SqlConnection,SqlCommand. -
Entity Framework : ORM, génère les requêtes SQL automatiquement à partir de classes (
DbContext).
15. Qu’est-ce que using en C# ?
-
Bloc
using→ garantit la libération d’une ressource qui implémenteIDisposable.
👉 Exemple :
using (var conn = new SqlConnection(cs))
{
conn.Open();
}
🔹 Niveau 1 – Bases du C#
Exercice 1 : Types et conversions
Crée une méthode qui prend un int et retourne un string avec le texte :
"Le nombre est : X"
-
Convertir
intenstringcorrectement. -
Utiliser
string interpolation.
Exercice 2 : Tableaux et boucles
Écris une méthode qui prend un tableau d’entiers et retourne la somme des nombres pairs.
-
Utiliser
forouforeach. -
Bonus : utiliser LINQ.
Exercice 3 : Classe et struct
Définis :
-
Une classe
PersonavecNameetAge. -
Une struct
PointavecXetY.
Écris une méthode qui affiche leurs valeurs.
🔹 Niveau 2 – OOP et collections
Exercice 4 : Héritage et polymorphisme
abstract class Animal
{
public abstract void MakeSound();
}
class Dog : Animal { /* Implémente MakeSound */ }
class Cat : Animal { /* Implémente MakeSound */ }
-
Crée un tableau d’
Animalavec des chiens et chats. -
Parcours le tableau et appelle
MakeSound().
Exercice 5 : Interfaces et delegates
-
Crée une interface
IMathavec une méthodeint Operation(int a, int b) -
Crée un delegate
MathDelegatebasé sur cette interface. -
Implémente deux classes :
AddetMultiply. -
Utilise le delegate pour appeler
Operation()sur un tableau de ces objets.
Exercice 6 : Gestion des exceptions
Écris une méthode qui :
-
Demande à l’utilisateur d’entrer un nombre.
-
Gère les exceptions
FormatExceptionetOverflowException. -
Affiche le résultat ou un message d’erreur clair.
🔹 Niveau 3 – Asynchrone et LINQ
Exercice 7 : Async / Await
-
Crée une méthode
GetDataAsync()qui attend 2 secondes et retourne un entier. -
Crée une méthode
Main()qui appelle 3 foisGetDataAsync()en parallèle et affiche les résultats.
Exercice 8 : LINQ
-
Tu as un tableau d’objets
PersonavecNameetAge. -
Écris une requête LINQ pour :
-
Récupérer les personnes majeures (
Age >= 18). -
Trier par
Name. -
Afficher dans la console.
-
Exercice 9 : Dictionnaires et GroupBy
-
Tu as une liste de ventes :
(string Produit, int Quantité) -
Regroupe les ventes par produit et calcule la quantité totale par produit.
-
Affiche le résultat.
🔹 Niveau 4 – Pratique ASP.NET (si applicable)
Exercice 10 : Web API simple
-
Crée un Web API
GET /api/personsqui retourne une liste de personnes en JSON. -
Crée un POST /api/persons pour ajouter une personne à la liste.
-
Bonus : validation des champs
NameetAge.
Solution:
🔹 Niveau 1 – Bases du C#
using System;
using System.Linq;
class Niveau1
{
// Exercice 1 : Types et conversions
public static string IntToString(int x)
{
return $"Le nombre est : {x}";
}
// Exercice 2 : Somme des nombres pairs
public static int SumEvenNumbers(int[] numbers)
{
return numbers.Where(n => n % 2 == 0).Sum();
}
// Exercice 3 : Classe et struct
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
}
public struct Point
{
public int X;
public int Y;
}
public static void DisplayPersonAndPoint()
{
Person p = new Person { Name = "Alice", Age = 30 };
Point pt = new Point { X = 5, Y = 10 };
Console.WriteLine($"Person: {p.Name}, {p.Age}");
Console.WriteLine($"Point: X={pt.X}, Y={pt.Y}");
}
}
🔹 Niveau 2 – OOP et collections
using System;
using System.Collections.Generic;
// Exercice 4 : Héritage et polymorphisme
abstract class Animal
{
public abstract void MakeSound();
}
class Dog : Animal
{
public override void MakeSound() => Console.WriteLine("Woof!");
}
class Cat : Animal
{
public override void MakeSound() => Console.WriteLine("Meow!");
}
// Exercice 5 : Interfaces et delegates
interface IMath
{
int Operation(int a, int b);
}
delegate int MathDelegate(int a, int b);
class Add : IMath
{
public int Operation(int a, int b) => a + b;
}
class Multiply : IMath
{
public int Operation(int a, int b) => a * b;
}
// Exercice 6 : Gestion des exceptions
class ExceptionDemo
{
public static void AskNumber()
{
try
{
Console.Write("Entrez un nombre : ");
int n = int.Parse(Console.ReadLine());
Console.WriteLine($"Vous avez entré : {n}");
}
catch (FormatException)
{
Console.WriteLine("Erreur : ce n'est pas un nombre valide.");
}
catch (OverflowException)
{
Console.WriteLine("Erreur : le nombre est trop grand ou trop petit.");
}
}
}
🔹 Niveau 3 – Asynchrone et LINQ
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
class Niveau3
{
// Exercice 7 : Async / Await
public static async Task<int> GetDataAsync(int id)
{
await Task.Delay(2000); // Simule un délai
return id * 10;
}
public static async Task RunAsyncTasks()
{
var tasks = new List<Task<int>>
{
GetDataAsync(1),
GetDataAsync(2),
GetDataAsync(3)
};
int[] results = await Task.WhenAll(tasks);
foreach (var r in results)
Console.WriteLine($"Résultat : {r}");
}
// Exercice 8 : LINQ sur personnes
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
}
public static void FilterAndSortPeople()
{
var people = new List<Person>
{
new Person { Name="Alice", Age=25 },
new Person { Name="Bob", Age=17 },
new Person { Name="Charlie", Age=30 }
};
var adults = people.Where(p => p.Age >= 18)
.OrderBy(p => p.Name);
foreach (var p in adults)
Console.WriteLine($"{p.Name}, {p.Age}");
}
// Exercice 9 : Dictionnaire et GroupBy
public static void GroupSales()
{
var sales = new List<(string Produit, int Quantite)>
{
("ProduitA", 5),
("ProduitB", 3),
("ProduitA", 7)
};
var totalByProduct = sales.GroupBy(s => s.Produit)
.Select(g => new { Produit = g.Key, Total = g.Sum(x => x.Quantite) });
foreach (var t in totalByProduct)
Console.WriteLine($"{t.Produit}: {t.Total}");
}
}
🔹 Niveau 4 – ASP.NET Web API simple
(Exemple minimal avec .NET 6+)
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Hosting;
using System.Collections.Generic;
var builder = WebApplication.CreateBuilder();
var app = builder.Build();
// In-memory list of persons
var persons = new List<Person>();
app.MapGet("/api/persons", () => persons);
app.MapPost("/api/persons", (Person p) =>
{
if (string.IsNullOrWhiteSpace(p.Name) || p.Age < 0)
return Results.BadRequest("Invalid data");
persons.Add(p);
return Results.Created($"/api/persons/{p.Name}", p);
});
app.Run();
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
}
Aucun commentaire:
Enregistrer un commentaire