Partage via


Visite guidée du langage C#

Cet article vous donne une vue d’ensemble générale du langage C#. Que vous écriviez votre premier programme ou que vous soyez un développeur expérimenté explorant C#, vous trouverez ici les concepts et fonctionnalités clés.

Conseil

Vous débutez avec la programmation ? Parcourez cet article pour avoir une vue d'ensemble, puis démarrez les didacticiels débutants pour écrire du code directement.

Venant de Java, JavaScript ou Python ? Lisez les conseils pour les développeurs Java, JavaScript ou Python en même temps que cet article.

Développeur expérimenté nouveau en C# ? Cet article décrit ce qui rend C# distinctif. Découvrez ce que vous pouvez créer avec C# pour trouver la charge de travail qui correspond à vos objectifs.

Le langage en C# constitue le langage le plus connu pour la plateforme .NET, un environnement de développement gratuit, open source et multiplateforme. Les programmes en C# peuvent s’exécuter sur plusieurs appareils différents, des appareils Internet des objets (IoT) au cloud et partout entre les deux. Vous pouvez écrire des applications pour les téléphones, les appareils de bureau, les ordinateurs portables et les serveurs. Découvrez ce que vous pouvez générer avec C# pour obtenir une vue d’ensemble des types d’applications.

C# est un langage à usage général multiplateforme qui rend les développeurs productifs tout en écrivant du code hautement performant. C# bénéficie d'un large soutien dans l'écosystème et pour de nombreuses charges de travail. Basé sur des principes orientés objet, il intègre de nombreuses fonctionnalités d’autres paradigmes, notamment la programmation fonctionnelle. Les fonctionnalités de bas niveau prennent en charge des scénarios à haute efficacité sans écrire de code non sécurisé. La plupart des runtimes et bibliothèques sont écrites en C#, et les avancées en C# bénéficient souvent à tous les développeurs .NET.

C# se trouve dans la famille C des langages. La syntaxe C# est familière si vous avez utilisé C, C++, JavaScript, TypeScript ou Java. Comme C et C++, les points-virgules (;) définissent la fin des instructions. Les identificateurs C# sont sensibles à la casse. C# a la même utilisation des accolades, { et }, des instructions de contrôle telles que if, else, et switch, et des structures de boucle comme for et while. C# dispose également d’une instruction foreach pour n’importe quel type de collection.

Hello World

Le programme « Hello, World » introduit traditionnellement un langage de programmation. Voici le programme en C# :

// This line prints "Hello, World"
Console.WriteLine("Hello, World");

La ligne commençant par // est un commentaire unique de ligne. Les commentaires uniques de ligne en C# commencent par // et continuent jusqu’à la fin de la ligne actuelle. C# prend également en charge les commentaires multilignes. Les commentaires multilignes commencent par /* et se terminent par */. La méthode WriteLine de la classe Console, qui se trouve dans l’espace de noms System, produit la sortie du programme. Les bibliothèques de classes standard fournissent cette classe, et chaque programme C# référence automatiquement ces bibliothèques par défaut. Un autre formulaire de programme vous oblige à déclarer la classe et la méthode conteneur pour le point d’entrée du programme. Le compilateur synthétise ces éléments lorsque vous utilisez des instructions de niveau supérieur.

Ce format alternatif est toujours valide et contient de nombreux concepts de base dans tous les programmes C#. De nombreux exemples C# existants utilisent le format équivalent suivant :

using System;
namespace TourOfCsharp;

class Program
{
    static void Main()
    {
        // This line prints "Hello, World" 
        Console.WriteLine("Hello, World");
    }
}

Le programme « Hello, World » précédent commence par une using directive qui fait référence au System namespace. Les espaces de noms représentent un moyen hiérarchique d’organiser les programmes et les bibliothèques C#. Les espaces de noms contiennent des types et d’autres espaces de noms. Par exemple, l’espace System de noms contient de nombreux types, tels que la Console classe référencée dans le programme, et de nombreux autres espaces de noms, tels que IO et Collections. Une directive using qui fait référence à un espace de noms donné permet l’utilisation non qualifiée des types membres de cet espace de noms. En raison de la directive using, le programme peut utiliser Console.WriteLine comme raccourci pour System.Console.WriteLine. Dans l’exemple précédent, cet espace de noms était implicitement inclus.

Note

Le programme précédent déclare la Program classe avec un seul membre : la méthode nommée Main. De nombreux exemples et didacticiels C# existants utilisent ce format. Par convention, lorsqu’il n’existe aucune instruction de niveau supérieur, une méthode statique nommée Main sert de point d’entrée d’un programme C#. Les deux formats sont compilés dans le même code. Vous n’avez pas besoin d’utiliser ce format : les applications basées sur des fichiers et les instructions de niveau supérieur sont des méthodes plus simples pour commencer.

Applications basées sur des fichiers

C# est un langage compilé . Dans la plupart des programmes C#, vous utilisez la dotnet build commande pour compiler un groupe de fichiers sources dans un package binaire. Ensuite, vous utilisez la dotnet run commande pour exécuter le programme. (Vous pouvez simplifier ce processus, car dotnet run compile le programme avant de l’exécuter si nécessaire.) Ces outils prennent en charge un langage riche d’options de configuration et de commutateurs de ligne de commande. L’interface dotnet de ligne de commande (CLI), incluse dans le Kit de développement logiciel (SDK) .NET, fournit de nombreux outils pour générer et modifier des fichiers C#.

À compter de C# 14 et .NET 10, vous pouvez créer des applications basées sur des fichiers, ce qui simplifie la création et l’exécution de programmes C#. Vous utilisez la dotnet run commande pour exécuter un programme contenu dans un seul *.cs fichier. Par exemple, si le code suivant est stocké dans un fichier nommé hello-world.cs, vous pouvez l’exécuter en tapant dotnet run hello-world.cs:

#!/usr/bin/env dotnet

Console.WriteLine("Hello, World!");

La première ligne du programme contient la séquence #! (shebang) pour les shells Unix. L’emplacement de l’interface dotnet CLI peut varier selon différentes distributions. Sur n’importe quel système unix, si vous définissez l’autorisation d’exécution (+x) sur un fichier C# qui contient la directive shebang, vous pouvez exécuter le fichier C# directement à partir de la ligne de commande :

./hello-world.cs

La source de ces programmes doit être un seul fichier, mais sinon toute la syntaxe C# est valide. Vous pouvez utiliser des applications basées sur des fichiers pour de petits utilitaires en ligne de commande, des prototypes ou d’autres expériences.

Fonctionnalités C# connues

C# est accessible aux débutants, tout en offrant des fonctionnalités avancées aux développeurs expérimentés qui écrivent des applications spécialisées. Vous pouvez rapidement devenir productif. Vous pouvez apprendre d’autres techniques spécialisées si vous en avez besoin pour vos applications.

Les applications C# bénéficient de la gestion automatique de la mémoire du runtime. Les applications en C# utilisent également les vastes bibliothèques de runtime fournies par le Kit de développement logiciel (SDK) .NET. Certains composants sont indépendants de la plateforme, comme les bibliothèques de système de fichiers, les collections de données et les bibliothèques de mathématiques. D’autres sont spécifiques à une seule charge de travail, comme les bibliothèques web ASP.NET Core ou la bibliothèque d’interface utilisateur .NET MAUI. Un écosystème open source riche sur NuGet augmente les bibliothèques qui font partie du runtime. Ces bibliothèques proposent des composants supplémentaires que vous pouvez utiliser.

C# est un langage fortement typé. Les variables que vous déclarez ont un type connu au moment de la compilation. Le compilateur ou les outils d’édition vous indiquent si vous utilisez ce type de façon incorrecte. Vous pouvez corriger ces erreurs avant d’exécuter votre programme. Les Types de données fondamentaux sont générés dans le langage et le runtime : les types valeur tels que int, double, char, les types référence tels que string, les tableaux et d’autres collections. Au fur et à mesure que vous écrivez vos programmes, vous créez vos propres types. Ces types peuvent être des types struct pour des valeurs ou des types class qui définissent un comportement orienté sur l’objet. Vous pouvez ajouter le modificateur record sur des types struct ou class afin que le compilateur synthétise du code pour des comparaisons d’égalité. Vous pouvez également créer des définitions interface qui définissent un contrat ou un groupe de membres qu’un type implémentant cette interface doit fournir. Vous pouvez également définir des méthodes et des types génériques. Les Génériques utilisent des paramètres de type pour fournir un espace réservé pour un type réel lorsqu’il est utilisé.

Quand vous écrivez du code, vous définissez des fonctions, également appelées méthodes, comme membres des types struct et class. Ces méthodes définissent le comportement de vos types. Vous pouvez surcharger des méthodes avec différents nombres ou types de paramètres. Les méthodes peuvent éventuellement retourner une valeur. Outre les méthodes, les types en C# peuvent avoir des propriétés qui sont des éléments de donnée soutenus par des fonctions appelées accesseurs. Les types en C# peuvent définir des événements qui permettent à un type d’informer les abonnés des actions importantes. C# prend en charge les techniques orientées vers l’objet telles que l’héritage et le polymorphisme pour les types class.

Les applications en C# utilisent des exceptions pour signaler et traiter des erreurs. Cette pratique est familière si vous avez utilisé C++ ou Java. Votre code lève une exception quand il ne peut pas effectuer ce qui était prévu. Un autre code, peu importe les niveaux de la pile des appels, peut éventuellement effectuer une récupération en utilisant un bloc try - catch.

Conseil

Pour en savoir plus sur les types, méthodes et exceptions, consultez la section principes de base C# . Il couvre le système de type, la programmation orientée objet et la gestion des exceptions en profondeur.

Fonctionnalités distinctes de C#

Il est possible que certains éléments de C# soient moins connus.

C# fournit la correspondance de motifs. Ces expressions vous permettent d’inspecter des données et de prendre des décisions en fonction de leurs caractéristiques. La correspondance de motifs offre une excellente syntaxe pour un flux de contrôle basé sur les données. Le code suivant montre comment les méthodes pour les opérations booléennes et, ou, et xor pourraient être exprimées en utilisant la syntaxe des correspondances de motifs :

public static bool Or(bool left, bool right) =>
    (left, right) switch
    {
        (true, true) => true,
        (true, false) => true,
        (false, true) => true,
        (false, false) => false,
    };

public static bool And(bool left, bool right) =>
    (left, right) switch
    {
        (true, true) => true,
        (true, false) => false,
        (false, true) => false,
        (false, false) => false,
    };
public static bool Xor(bool left, bool right) =>
    (left, right) switch
    {
        (true, true) => false,
        (true, false) => true,
        (false, true) => true,
        (false, false) => false,
    };

Les correspondances de modèles peuvent être simplifiées à l'aide de _ comme catchall pour n'importe quelle valeur. L’exemple suivant illustre comment vous pouvez simplifier les méthodes et :

public static bool ReducedAnd(bool left, bool right) =>
    (left, right) switch
    {
        (true, true) => true,
        (_, _) => false,
    };

Les exemples précédents déclarent également des tuples, qui sont des structures de données légères. Un tuple est une séquence ordonnée de valeurs de longueur fixe avec des noms facultatifs et des types individuels. Vous placez la séquence entre les caractères ( et ). La déclaration (left, right) définit un tuple avec deux valeurs booléennes : left et right. Chaque bras de commutateur déclare une valeur tuple telle que (true, true). Les tuples fournissent une syntaxe pratique pour déclarer une valeur unique avec plusieurs valeurs de n’importe quel type.

Les expressions de collection fournissent une syntaxe commune pour fournir des valeurs de collection. Vous écrivez des valeurs ou des expressions entre les caractères [ et ], et le compilateur convertit ces expressions en le type de collection requis.

int[] numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
List<string> names = ["Alice", "Bob", "Charlie", "David"];

IEnumerable<int> moreNumbers = [.. numbers, 11, 12, 13];
IEnumerable<string> empty = [];

L’exemple précédent montre différents types de collection que vous pouvez initialiser à l’aide d’expressions de collection. Un exemple utilise l’expression [] de collection vide pour déclarer une collection vide. Un autre exemple utilise l’élément ..de propagation pour développer une collection et ajouter toutes ses valeurs à l’expression de collection.

Vous pouvez utiliser des expressions d’index et de plage pour récupérer un ou plusieurs éléments d’une collection indexable :

string second = names[1]; // 0-based index
string last = names[^1]; // ^1 is the last element
int[] smallNumbers = numbers[0..5]; // 0 to 4

L’index ^ indique à partir de la fin plutôt qu’au début. L’élément ^0 est un élément au-delà de la fin de la collection, donc ^1 est le dernier élément. Dans une expression de plage, .. désigne la plage d'éléments à inclure. La plage commence par le premier index et inclut tous les éléments jusqu'à, sans inclure, l'élément au dernier index.

Pour plus d’informations sur les expressions d’index et de plage, consultez l’article Explorer les index et les plages .

La Language Integrated Query (LINQ) offre une syntaxe basée sur un modèle courant pour interroger ou transformer une collection de données. LINQ unifie la syntaxe pour interroger des collections dans la mémoire, des données structurées comme XML ou JSON, un stockage de base de données et même des API de données dans le cloud. Vous apprenez un jeu de syntaxes et vous pouvez rechercher et manipuler des données, quel que soit leur stockage. La requête suivante trouve tous les étudiants dont la moyenne générale est supérieure à 3,5 :

var honorRoll = from student in Students
                where student.GPA > 3.5
                select student;

La requête précédente fonctionne pour plusieurs types de stockage représentés par Students. Il peut s’agir d’une collection d’objets, une table de base de données, un blob de stockage cloud ou une structure XML. La même syntaxe de requête fonctionne pour tous les types de stockage.

Le Modèle de programmation asynchrone basé sur la tâche vous permet d’écrire du code pouvant lire comme s’il s’exécutait de manière synchrone, bien qu’il s’exécute de manière asynchrone. Il utilise les mots clés async et await pour décrire des méthodes qui sont asynchrones et quand une expression évalue de façon asynchrone. L’exemple suivant attend une requête web asynchrone. Une fois l’opération asynchrone terminée, la méthode retourne la longueur de la réponse :

public static async Task<int> GetPageLengthAsync(string endpoint)
{
    var client = new HttpClient();
    var uri = new Uri(endpoint);
    byte[] content = await client.GetByteArrayAsync(uri);
    return content.Length;
}

C# prend également en charge une instruction await foreach pour itérer une collection soutenue par une opération asynchrone, comme une API de pagination GraphQL. L’exemple suivant lit des données par segments et retourne un itérateur qui donne accès à chaque élément quand il est disponible :

public static async IAsyncEnumerable<int> ReadSequence()
{
    int index = 0;
    while (index < 100)
    {
        int[] nextChunk = await GetNextChunk(index);
        if (nextChunk.Length == 0)
        {
            yield break;
        }
        foreach (var item in nextChunk)
        {
            yield return item;
        }
        index++;
    }
}

Les utilisateurs peuvent itérer la collection à l'aide de l'instruction await foreach :

await foreach (var number in ReadSequence())
{
    Console.WriteLine(number);
}

Enfin, dans le cadre de l’écosystème .NET, vous pouvez utiliser Visual Studio ou Visual Studio Code avec le DevKit en C#. Ces outils offrent une compréhension enrichie de C#, notamment le code que vous écrivez. Ils fournissent également des capacités de débogage.

Conseil

Pour en savoir plus sur la correspondance de modèles, LINQ et la programmation asynchrone, consultez les techniques fonctionnelles, la vue d’ensemble de LINQ et les sections de programmation asynchrone .

Prochaines étapes

Cet article a fourni une visite guidée rapide de la langue C#. Voici où aller ensuite, en fonction de votre expérience :