Bases
Hello World
Console.WriteLine("Hello, World!"); // top-level (C# 10+) // Classique : class Program { static void Main() { ... } }
Compiler et exécuter
dotnet new console -n MyApp # créer un projet dotnet run # compiler et exécuter dotnet build # compiler seulement
Variables et constantes
int x = 42; var name = "Alice"; // inférence de type const double Pi = 3.14159; readonly int maxRetries = 3; // défini une fois, dans le ctor
Types
Types valeur
intEntier signé 32 bits
longEntier signé 64 bits
floatVirgule flottante 32 bits (suffixe f)
doubleVirgule flottante 64 bits
decimalHaute précision 128 bits (suffixe m)
booltrue / false
charCaractère Unicode 16 bits
Types référence
stringTexte UTF-16 immuable
objectType de base pour tous les types
dynamicContourne la vérification de type à la compilation
int[]Tableau d'entiers
List<T>Liste générique (System.Collections.Generic)
Types nullables et tuples
int? age = null; // type valeur nullable string? name = null; // référence nullable (C# 8+) var point = (X: 1, Y: 2); // tuple nommé Console.WriteLine(point.X);
Fonctionnalités des chaînes
string name = "World"; string msg = $"Hello, {name}!"; // interpolation string path = @"C:\Users\file.txt"; // verbatim string raw = """raw "string" here"""; // brut (C# 11+)
Flux de contrôle
If / Else
if (x > 0) Console.WriteLine("positive"); else if (x == 0) Console.WriteLine("zero"); else Console.WriteLine("negative");
Switch et correspondance de motifs
string label = x switch { > 0 => "positive", 0 => "zero", _ => "negative" }; if (obj is string s && s.Length > 0) { } // correspondance de motif
Boucles
for (int i = 0; i < 10; i++) { } foreach (var item in collection) { } while (condition) { } do { } while (condition);
Classes
Définition d'une classe
public class Person { public string Name { get; set; } public int Age { get; init; } // init-only (C# 9+) public Person(string name, int age) { Name = name; Age = age; } }
Records (C# 9+)
public record Point(double X, double Y); var p1 = new Point(1, 2); var p2 = p1 with { X = 3 }; // copie non destructive // auto : Equals, GetHashCode, ToString, déconstruction
Héritage
public abstract class Shape { public abstract double Area(); } public class Circle(double r) : Shape { public override double Area() => Math.PI * r * r; }
Modificateurs d'accès
publicAccessible depuis n'importe où
privateMême classe uniquement (défaut pour les membres)
protectedMême classe et classes dérivées
internalMême assembly uniquement (défaut pour les classes)
protected internalMême assembly ou classes dérivées
Interfaces
Définition d'interface
public interface IShape { double Area(); double Perimeter() => 0; // impl par défaut (C# 8+) } public class Rect(double w, double h) : IShape { public double Area() => w * h; }
Interfaces courantes
IEnumerable<T>Support de l'itération (foreach, LINQ)
IDisposableNettoyage déterministe (instruction using)
IComparable<T>Ordre naturel pour le tri
IEquatable<T>Comparaison d'égalité de valeur
ICloneableClonage d'objet
LINQ
Syntaxe de méthode
var result = numbers .Where(n => n > 3) .OrderBy(n => n) .Select(n => n * 2) .ToList();
Syntaxe de requête
var result = from n in numbers where n > 3 orderby n select n * 2;
Méthodes LINQ courantes
.Where(pred)Filtrer les éléments
.Select(func)Projeter/transformer les éléments
.OrderBy(key)Trier en ordre croissant
.GroupBy(key)Grouper les éléments par clé
.First() / .FirstOrDefault()Premier élément (ou valeur par défaut)
.Any(pred)true si un élément correspond
.Count()Nombre d'éléments
.Sum() / .Average()Agréger des valeurs numériques
.Distinct()Supprimer les doublons
.SelectMany(func)Aplatir des collections imbriquées
Async/Await
Méthode async
public async Task FetchAsync(string url) { using var client = new HttpClient(); return await client.GetStringAsync(url); }
Combinateurs de tâches
var results = await Task.WhenAll(task1, task2, task3); var first = await Task.WhenAny(task1, task2);
Patterns async
TaskRetour async void (sans résultat)
Task<T>Retour async avec résultat de type T
ValueTask<T>Tâche légère pour les chemins synchrones rapides
await foreachItération async sur IAsyncEnumerable
CancellationTokenAnnulation coopérative des opérations async
Collections
Collections courantes
List<T>Tableau dynamique, accès par index rapide
Dictionary<K,V>Table de hachage, O(1) par clé
HashSet<T>Éléments uniques, O(1) de recherche
Queue<T>Collection FIFO
Stack<T>Collection LIFO
LinkedList<T>Liste doublement chaînée
SortedDictionary<K,V>Trié par clé (basé sur arbre)
Utilisation d'un Dictionary
var dict = new Dictionary { ["Alice"] = 90, ["Bob"] = 85 }; dict.TryGetValue("Alice", out int score); foreach (var (key, val) in dict) { }
Collections immuables
using System.Collections.Immutable; var list = ImmutableList.Create(1, 2, 3); var newList = list.Add(4); // retourne une nouvelle liste
Propriétés
Syntaxe des propriétés
public string Name { get; set; } public int Age { get; private set; } public string Email { get; init; } // init-only public string Display => $"{Name} ({Age})"; // calculée
Indexeurs
public double this[int row, int col] { get => data[row, col]; set => data[row, col] = value; }
Patterns de propriétés
{ get; set; }Propriété auto en lecture-écriture
{ get; }Lecture seule (défini uniquement dans le constructeur)
{ get; init; }Lecture seule après initialisation (C# 9+)
{ get; private set; }Lecture publique, écriture privée
=> expressionPropriété à corps d'expression (calculée)
Exceptions
Try / Catch / Finally
try { int result = int.Parse(input); } catch (FormatException ex) { Console.Error.WriteLine(ex.Message); } catch (Exception ex) when (ex is not OutOfMemoryException) { } finally { /* s'exécute toujours */ }
Instruction using
using var file = File.OpenRead("data.txt"); // file.Dispose() appelé automatiquement à la fin du scope // équivalent à try/finally avec Dispose()
Exceptions courantes
ArgumentNullExceptionArgument null passé à une méthode
ArgumentOutOfRangeExceptionArgument hors de la plage valide
InvalidOperationExceptionOpération invalide pour l'état courant
NullReferenceExceptionDéréférencement d'un objet null
KeyNotFoundExceptionClé introuvable dans le dictionnaire
NotImplementedExceptionMéthode non encore implémentée
Exception personnalisée
public class AppException : Exception { public int Code { get; } public AppException(string msg, int code) : base(msg) { Code = code; } }