mardi 2 septembre 2025

Question technique

 

1. Les bases du langage C#

  • Différence entre class et struct

  • Différence entre abstract class et interface

  • Que veut dire sealed, virtual, override, new ?

  • Qu’est-ce qu’un delegate et un event ?

  • Différence entre IEnumerable, ICollection, IList

  • Différence entre ref et out

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 (pour IDisposable) ?

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, Thread et async/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 null sauf si Nullable<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éthode virtual ou abstract.

  • 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 de IEnumerable<T>, ajoute Count, Add, Remove.

  • IList<T> → hérite de ICollection<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émente IDisposable.
    👉 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 int en string correctement.

  • 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 for ou foreach.

  • Bonus : utiliser LINQ.


Exercice 3 : Classe et struct

Définis :

  • Une classe Person avec Name et Age.

  • Une struct Point avec X et Y.
    É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’Animal avec des chiens et chats.

  • Parcours le tableau et appelle MakeSound().


Exercice 5 : Interfaces et delegates

  • Crée une interface IMath avec une méthode int Operation(int a, int b)

  • Crée un delegate MathDelegate basé sur cette interface.

  • Implémente deux classes : Add et Multiply.

  • 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 FormatException et OverflowException.

  • 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 fois GetDataAsync() en parallèle et affiche les résultats.


Exercice 8 : LINQ

  • Tu as un tableau d’objets Person avec Name et Age.

  • Écris une requête LINQ pour :

    1. Récupérer les personnes majeures (Age >= 18).

    2. Trier par Name.

    3. 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/persons qui retourne une liste de personnes en JSON.

  • Crée un POST /api/persons pour ajouter une personne à la liste.

  • Bonus : validation des champs Name et Age.


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

Question technique Lượt xem: