Documentation C#
Référence C# concise et illustrée par des exemples. Lisez le concept, voyez le code, puis pratiquez-le dans un parcours Coddy.
Commencer un parcours guidé en C#Pour commencer
- Qu'est-ce que C#C# est un langage généraliste à typage statique, conçu par Microsoft, qui s'exécute sur .NET. À quoi il sert, son lien avec .NET, ce que chaque version a apporté et comment un programme C# est construit.
- Hello WorldVotre premier programme C# ligne par ligne : la méthode Main, Console.WriteLine et Write, la lecture d'une saisie avec Console.ReadLine, les commentaires, la création et l'exécution d'un projet avec la CLI dotnet, et les instructions de niveau supérieur.
- C# vs JavaC# et Java se ressemblent et résolvent des problèmes similaires. Les vraies différences tiennent aux propriétés, aux types valeur, aux génériques, à LINQ face aux streams, à l'asynchrone, aux exceptions et aux écosystèmes. Une comparaison côte à côte avec du code.
- C# vs C++C# est un langage managé avec un ramasse-miettes ; C++ compile en code natif et vous donne un contrôle manuel de la mémoire. Comment cette différence se traduit en sûreté, en performances, en moteurs de jeu, en modèle de compilation et en difficulté d'apprentissage.
- Namespaces et usingComment les namespaces C# organisent les types et comment la directive using les importe : alias, using static, noms complets, résolution des références ambiguës, usings globaux et namespaces de portée fichier.
Les bases
- VariablesComment déclarer et affecter des variables en C#, quand var est une bonne idée et quand il ne l'est pas, comment fonctionne la portée, la différence entre const, readonly et static readonly, les conventions de nommage et l'erreur de variable non assignée.
- Types de donnéesChaque type intégré de C# avec sa taille, sa plage et son suffixe littéral, la différence entre types valeur et types référence, pourquoi decimal est le type de l'argent, le dépassement d'entier et checked, et les valeurs par défaut.
- String en intComment convertir une chaîne en int en C# avec int.Parse, int.TryParse et Convert.ToInt32, comment fonctionnent les casts implicites et explicites, pourquoi caster un double le tronque, les opérateurs as et is, et pourquoi "1.5" peut donner 15.
- OpérateursLes opérateurs de C# et leur comportement exact : division entière, modulo avec des nombres négatifs, incrémentation et affectation composée, comparaison, logique en court-circuit, opérateurs bit à bit, opérateurs null et un tableau des priorités.
- Chaînes (string)Comment fonctionnent les chaînes en C# : immuabilité, Length et indexation, comparaison avec ==, Equals et string.Compare, caractères d'échappement, chaînes verbatim @ et texte multiligne, littéraux de chaîne bruts, tests null et vide, et parcours des caractères.
- SubstringComment fonctionne String.Substring en C# : les arguments index de départ et longueur, l'ArgumentOutOfRangeException et comment l'éviter, extraire du texte autour d'un résultat d'IndexOf, prendre les n premiers ou derniers caractères, et l'opérateur de plage de C# 8.
- Interpolation de chaînesComment fonctionne l'interpolation de chaînes $"..." en C# : expressions entre accolades, spécificateurs de format comme F2, N0, C, D5 et X, alignement pour les tableaux, échappement des accolades, string.Format et formatage composite, chaînes interpolées verbatim et brutes, et formatage pour une culture précise.
- Méthodes de stringLes méthodes de String que vous utilisez tous les jours en C# : Split avec plusieurs séparateurs et options, Replace, Contains et la recherche insensible à la casse, IndexOf et LastIndexOf, StartsWith et EndsWith, Trim, ToUpper et ToLower, PadLeft, Join, Concat et l'inversion d'une chaîne.
- StringBuilderPourquoi la concaténation répétée de chaînes dans une boucle est lente en C#, et comment StringBuilder y remédie : Append, AppendLine, AppendFormat, Insert, Remove, Replace, la capacité, et quand la concaténation simple ou string.Join est le meilleur choix.
- Nombres aléatoiresComment générer des nombres aléatoires en C# avec la classe Random : Next et sa borne supérieure exclue, des doubles aléatoires dans un intervalle, les graines pour des résultats reproductibles, choisir un élément au hasard, mélanger une liste, le piège de new Random dans une boucle, et les nombres cryptographiquement sûrs.
- DateTimeTravailler avec les dates et heures en C# : créer des valeurs DateTime, Now, UtcNow ou Today, ajouter des jours et des mois, soustraire pour obtenir un TimeSpan, TotalHours ou Hours, comparer des dates, DayOfWeek, analyser avec ParseExact et TryParse, DateTimeOffset et DateOnly.
- Format DateTimeComment formater un DateTime en chaîne en C# : les chaînes de format standard (d, D, o, s, u, t), les modèles personnalisés comme yyyy-MM-dd HH:mm:ss, un tableau complet des spécificateurs, l'effet de la culture sur la sortie, l'aller-retour ISO 8601 avec "o", et les erreurs mm ou MM et hh ou HH.
Structures de contrôle
- if elseComment fonctionnent if, else if et else en C# : pourquoi les conditions doivent être des bool, combiner des tests avec &&, || et !, quand les accolades comptent, les clauses de garde plutôt qu'une imbrication profonde, et les bugs = au lieu de == et du point-virgule égaré.
- Instruction switchComment fonctionne l'instruction switch en C# : switch sur des valeurs int, string, char et enum, pourquoi chaque case a besoin de break (erreur CS0163), empiler des étiquettes case pour plusieurs valeurs, goto case, default, la casse des chaînes, et les étiquettes à pattern avec when.
- Expression switchL'expression switch de C# 8 transforme une valeur en résultat avec des branches à pattern au lieu de case et break. Syntaxe, le discard _, patterns de propriété, de tuple et relationnels, and/or/not, gardes when, avertissements d'exhaustivité et SwitchExpressionException, avec des équivalents C# 7 exécutables.
- Opérateur ternaireL'opérateur conditionnel de C#, condition ? a : b, choisit l'une de deux valeurs. Comment il s'évalue, pourquoi les deux branches ont besoin d'un type commun (CS0173) et le cast qui corrige l'erreur, les ternaires imbriqués, les parenthèses dans l'interpolation, et quand ?? et ?. l'expriment mieux.
- Boucle forComment fonctionne la boucle for en C# : l'initialiseur, la condition et l'itérateur, compter à rebours et avancer par pas, plusieurs variables de boucle, parcourir un tableau par index, les boucles imbriquées, for(;;), et les bugs de décalage d'un cran et de suppression pendant l'itération.
- Boucle foreachComment fonctionne foreach en C# : parcourir des tableaux, des listes, des chaînes et des dictionnaires (KeyValuePair et déconstruction), obtenir l'index, pourquoi la variable de boucle est en lecture seule, l'InvalidOperationException « Collection was modified » et ses corrections, et ce qu'un type doit avoir pour être utilisé dans foreach.
- Boucle whileComment fonctionnent les boucles while et do while en C# : la condition vérifiée avant ou après le corps, lire une saisie jusqu'à une valeur d'arrêt ou jusqu'à la fin de l'entrée, while (true) avec break, et les erreurs de boucle infinie qui piègent les développeurs.
- break et continueComment fonctionnent break, continue et goto en C# : terminer une boucle plus tôt, sauter une itération, break dans un switch, trois façons de sortir de boucles imbriquées (un indicateur, goto ou une méthode avec return), et le bug de boucle infinie de continue dans un while.
Méthodes et délégués
- MéthodesComment déclarer et appeler des méthodes en C# : types de retour et void, paramètres, méthodes à corps d'expression, renvoyer plusieurs valeurs avec un tuple, surcharge, tableaux params, méthodes statiques ou d'instance, la méthode Main, la récursivité et les fonctions locales.
- Paramètres optionnelsComment fonctionnent les paramètres optionnels et les arguments nommés en C# : valeurs par défaut et règle de la constante de compilation, ordre des paramètres, sauter des arguments par leur nom, paramètres optionnels ou surcharges, attributs d'information sur l'appelant, et le piège de version des valeurs par défaut figées chez l'appelant.
- ref et outComment fonctionnent les paramètres ref, out et in en C# : passer une variable plutôt qu'une copie, out pour des résultats supplémentaires et le schéma TryParse, out var, les paramètres in en lecture seule, les règles d'affectation définie, et ce qui change quand l'argument est un type référence.
- Expressions lambdaComment fonctionnent les expressions lambda en C# : la syntaxe => sous toutes ses formes, stocker des lambdas dans Func et Action, les passer à des méthodes et à LINQ, les lambdas à instructions, les closures sur des variables capturées, et le bug de capture de la boucle for que foreach n'a pas.
- DéléguésCe qu'est un délégué en C# et comment l'utiliser : déclarer un type délégué, le créer à partir d'une méthode, d'une lambda ou d'une méthode anonyme, l'invoquer, les délégués comme callbacks, les délégués multicast avec += et -=, les tests de null avec ?.Invoke, et le lien entre les délégués, Func, Action et les événements.
- Func et ActionComment fonctionnent Func et Action en C# : Func<T, TResult> pour les fonctions qui renvoient une valeur, Action<T> pour celles qui n'en renvoient pas, Predicate et Comparison, passer et renvoyer des fonctions, un dictionnaire de commandes, les lambdas async, et quand déclarer plutôt son propre délégué.
- ÉvénementsComment fonctionnent les événements en C# : déclarer un événement avec EventHandler et EventHandler<T>, les classes EventArgs personnalisées, s'abonner et se désabonner avec += et -=, déclencher un événement sans risque avec ?.Invoke, pourquoi un événement vaut mieux qu'un champ délégué public, et la fuite mémoire causée par un désabonnement oublié.
- Méthodes d'extensionComment fonctionnent les méthodes d'extension en C# : une méthode statique dans une classe statique avec this sur le premier paramètre, l'appeler comme une méthode d'instance, étendre string, les enums et IEnumerable<T>, comment LINQ en est construit, pourquoi les méthodes d'instance l'emportent, les récepteurs null, et la directive using dont elles ont besoin.
Collections et LINQ
- TableauxUn tableau C# est un bloc de taille fixe d'éléments d'un même type. Apprenez à déclarer et initialiser des tableaux, lire Length, trier et chercher avec la classe Array, les copier sans risque, et manipuler les tableaux 2D et les tableaux en escalier.
- ListList<T> est le tableau extensible de C#. Apprenez à créer une liste, ajouter et insérer des éléments, supprimer par valeur, par index ou par condition, chercher avec Contains et Find, trier par propriété, et éviter l'erreur provoquée par la modification d'une liste dans un foreach.
- DictionaryDictionary<TKey, TValue> associe des clés à des valeurs avec une recherche rapide. Apprenez à ajouter et mettre à jour des entrées, lire sans risque avec TryGetValue, parcourir les KeyValuePair, compter des occurrences, ignorer la casse des clés, et garder les clés triées avec SortedDictionary.
- HashSetHashSet<T> contient des éléments uniques et répond à Contains en temps constant. Apprenez comment Add signale les doublons, comment supprimer les doublons d'une liste, comment faire l'union, l'intersection et la différence d'ensembles, et comment faire comparer vos propres objets par valeur.
- QueueQueue<T> est une collection premier entré, premier sorti : les éléments sortent dans l'ordre où ils sont arrivés. Apprenez Enqueue, Dequeue et Peek, l'exception de file vide et TryDequeue, le parcours en largeur avec une file, et quand recourir à ConcurrentQueue ou PriorityQueue.
- StackStack<T> est une collection dernier entré, premier sorti : l'élément ajouté le plus récemment sort en premier. Apprenez Push, Pop et Peek, l'exception de pile vide et TryPop, pourquoi une pile s'énumère à l'envers, et deux usages classiques : un historique d'annulation et la vérification des parenthèses équilibrées.
- TuplesUn tuple C# regroupe quelques valeurs en une seule sans déclarer de type. Apprenez la syntaxe des value tuples, les éléments nommés, renvoyer plusieurs valeurs depuis une méthode, déconstruire avec var (a, b), les clés tuple dans un dictionnaire, et ce qui distingue ValueTuple de l'ancien System.Tuple.
- LINQLINQ ajoute des opérateurs de requête à toutes les collections C#. Apprenez la syntaxe de méthode et la syntaxe de requête, filtrer avec Where, projeter avec Select, trier avec OrderBy et ThenBy, grouper avec GroupBy, le piège First ou FirstOrDefault, les agrégats, et comment l'exécution différée change le moment où votre requête s'exécute.
- IEnumerable et yieldIEnumerable<T> est l'interface derrière foreach et LINQ, et yield return est la façon la plus simple de l'implémenter. Apprenez le lien entre IEnumerable, ICollection et List, comment une méthode itérateur s'exécute pas à pas, yield break, les séquences infinies et les pièges de l'évaluation paresseuse.
Classes et types
- Classes et objetsComment déclarer une classe en C#, lui donner des champs et des méthodes, créer des objets avec new, et ce que signifie qu'une classe soit un type référence : objets partagés, null et NullReferenceException, ToString et initialiseurs d'objets.
- ConstructeursComment fonctionnent les constructeurs en C# : le constructeur par défaut implicite et quand il disparaît, les constructeurs paramétrés et surchargés, le chaînage avec this(...) et base(...), l'ordre d'exécution, les constructeurs statiques et privés, et les constructeurs principaux de C# 12.
- PropriétésComment fonctionnent les propriétés en C# : les accesseurs get et set autour d'un champ de stockage, les propriétés automatiques, private set et les propriétés en lecture seule, les propriétés calculées, la validation dans les setters, et les mots-clés init et required de C# 9 et 11.
- Mot-clé staticCe que signifie static en C# : des membres qui appartiennent au type plutôt qu'à un objet, un état partagé entre instances, les méthodes et classes statiques, les constructeurs statiques, const ou static readonly, using static, et l'erreur CS0120.
- Modificateurs d'accèsLes six modificateurs d'accès de C# (public, private, protected, internal, protected internal, private protected), ce que chacun autorise, les valeurs par défaut quand vous n'en écrivez aucun, et les erreurs de compilation qu'ils produisent.
- HéritageComment fonctionne l'héritage de classes en C# : dériver avec deux-points, ce qui est hérité et ce qui ne l'est pas, appeler la classe de base avec base, virtual et override, masquer avec new (et la sortie qui surprend tout le monde), sealed, le polymorphisme, et les conversions vers le haut et vers le bas d'une hiérarchie.
- Classes abstraitesCe qu'est une classe abstraite en C# : une classe de base qu'on ne peut pas instancier et qui peut déclarer des membres abstraits que ses classes dérivées doivent implémenter. Couvre les méthodes et propriétés abstraites, les constructeurs, le patron de méthode, et quand choisir plutôt une interface.
- InterfacesComment fonctionnent les interfaces en C# : en déclarer une, l'implémenter dans des classes et des structs, utiliser l'interface comme type, en implémenter plusieurs à la fois, l'implémentation explicite, les interfaces du framework que vous implémenterez le plus (IComparable<T>, IEnumerable<T>, IDisposable), et les méthodes d'interface par défaut de C# 8.
- StructsComment fonctionnent les structs en C# : la sémantique de valeur et la copie à l'affectation, l'erreur de modification dans une List<T>, les règles des constructeurs, l'égalité, le boxing, readonly struct et record struct, et une comparaison struct ou classe avec des conseils sur le moment où une struct est le bon choix.
- EnumsComment fonctionnent les enums en C# : déclarer des constantes nommées, valeurs entières sous-jacentes et casts, convertir un enum en chaîne et une chaîne en enum avec Parse et TryParse, lister toutes les valeurs, [Flags] avec les opérateurs bit à bit et HasFlag, faire un switch sur un enum, et gérer les valeurs non définies.
- RecordsCe que sont les records en C# (C# 9 et plus) : la syntaxe positionnelle, les membres générés par le compilateur, l'égalité par valeur, les copies non destructives avec with, le ToString intégré, record struct depuis C# 10, l'héritage entre records, et la classe équivalente écrite à la main.
- GénériquesComment fonctionnent les génériques en C# : écrire des classes et méthodes génériques avec des paramètres de type, l'inférence de type, les contraintes avec where (class, struct, new(), classes de base, interfaces), default(T), les membres statiques par type, et la covariance avec IEnumerable<out T>.
- Types nullablesTout sur null en C# : les types valeur nullables (int?, Nullable<T>) avec HasValue, Value et GetValueOrDefault, les opérateurs de fusion null ?? et ??=, l'opérateur conditionnel null ?., les tests de null, et les types référence nullables (string?) de C# 8.
- Pattern matchingComment fonctionne le pattern matching en C# : l'opérateur is avec les patterns de type et de constante, les instructions switch avec des patterns de case et when, les expressions switch, les patterns de propriété, de tuple et positionnels, les patterns relationnels et logiques (and, or, not), les patterns de liste, et la version de C# qui a ajouté chacun.
Exceptions
- try catchtry, catch et finally sont la façon dont C# gère les exceptions. Apprenez comment une exception remonte la pile d'appels, comment intercepter des types d'exception précis dans le bon ordre, filtrer avec when, nettoyer dans finally, relancer avec throw; sans perdre la trace de pile, et quelles exceptions ne pas intercepter.
- Lever des exceptionsComment et quand lever des exceptions en C#. Apprenez l'instruction throw, quel type d'exception intégré correspond à quelle erreur, les expressions throw avec ?? et ?:, les fonctions ThrowIfNull, et comment écrire une classe d'exception personnalisée avec ses propres données et une exception interne.
- Instruction usingL'instruction using garantit que Dispose est appelé sur les fichiers, flux, connexions et autres objets IDisposable, même quand une exception est levée. Apprenez en quoi elle se compile, dans quel ordre les objets sont libérés, la déclaration using de C# 8, et comment implémenter IDisposable dans votre propre classe.
Asynchrone et threads
- Async et awaitasync et await permettent au code C# d'attendre des opérations lentes sans bloquer de thread. Apprenez comment s'exécute une méthode async, Task et Task<T>, lancer en même temps des opérations indépendantes avec Task.WhenAll, les exceptions dans le code async, et pourquoi async void et .Result provoquent des bugs et des interblocages.
- TâchesTask est l'unité de travail asynchrone et parallèle de .NET. Apprenez Task.Run pour le travail lié au CPU, la lecture des résultats, la combinaison de tâches avec WhenAll et WhenAny, les continuations, l'annulation avec CancellationToken, ce qui distingue une Task d'un Thread, et quand Parallel.For convient mieux.
- LockL'instruction lock ne laisse qu'un seul thread à la fois exécuter un bloc de code. Voyez une condition de concurrence corrompre un compteur, corrigez-la avec lock, apprenez sur quel objet verrouiller, utilisez Interlocked pour les compteurs simples, évitez les interblocages liés à l'ordre des verrous, et utilisez SemaphoreSlim quand le code à l'intérieur fait un await.
- TimerC# a plusieurs classes de timer, et elles se comportent différemment. Apprenez quand utiliser System.Threading.Timer, System.Timers.Timer, PeriodicTimer ou un timer d'interface, comment les démarrer et les arrêter, pourquoi les callbacks s'exécutent sur le pool de threads et peuvent se chevaucher, pourquoi un timer doit rester référencé, et comment mesurer un temps écoulé avec Stopwatch.
Fichiers, JSON et plus
- Lire et écrire des fichiersComment écrire dans un fichier et lire un fichier en C# : File.WriteAllText, ReadAllText, AppendAllText, WriteAllLines et ReadAllLines pour les fichiers entiers, StreamWriter et StreamReader pour les gros fichiers, les chemins avec Path.Combine, les dossiers, les encodages, et les exceptions que le code de fichiers doit gérer.
- JSONComment travailler avec du JSON en C# avec System.Text.Json : JsonSerializer.Serialize et Deserialize, sortie en camelCase et indentée, attributs comme JsonPropertyName et JsonIgnore, enums sous forme de chaînes, lire du JSON sans classe avec JsonDocument et JsonNode, erreurs, et comparaison avec Newtonsoft.Json.
- RegexComment utiliser les expressions régulières en C# avec System.Text.RegularExpressions : IsMatch, Match et Matches, groupes numérotés et nommés, Replace avec substitutions et lambda, Split, RegexOptions, chaînes verbatim pour les motifs, validation de saisie, délais d'expiration, et l'attribut GeneratedRegex de .NET 7.
- Réflexion et attributsComment fonctionne la réflexion en C# : les objets Type obtenus avec typeof et GetType, lire et définir des propriétés, appeler des méthodes par leur nom, créer des instances, et les attributs : les attributs intégrés comme Obsolete, déclarer les vôtres et les lire à l'exécution. Plus ce que coûte la réflexion.