Partager via


Visite guidée du langage C#

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.

C# est un langage à usage général multiplateforme qui rend les développeurs productifs tout en écrivant du code hautement performant. Avec des millions de développeurs, C# est le langage .NET le plus populaire. C# bénéficie d’une prise en charge étendue dans l’écosystème et dans toutes les charges de travail .NET. 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 bibliothèques et du runtime .NET sont écrits 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 en C# respectent la casse. C# fait usage des mêmes accolades, { et }, des instructions de contrôle telles que if, else et switch, et des constructions de bouclage comme for et while. C# dispose également d’une instruction foreach pour n’importe quel type de collection.

Hello World

Le programme « Hello, World » est souvent utilisé pour présenter un langage de programmation. Le voici 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. Cette classe est fournie par les bibliothèques de classes standard, qui, par défaut, sont référencées automatiquement dans chaque programme en C#. 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 bibliothèques et les programmes C#. Les espaces de noms contiennent des types et d’autres espaces de noms, par exemple, l’espace de noms System contient plusieurs types, notamment la classe Console référencée dans le programme, et divers 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.

La classe Program déclarée par le programme « Hello, World » a un membre unique, la méthode nommée Main. La méthode Main est déclarée avec le modificateur static. Si les méthodes d’instance peuvent faire référence à une instance d’objet englobante particulière avec le mot clé this, les méthodes statiques fonctionnent sans référence à un objet particulier. Par convention, quand 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#. La classe contenant la Main méthode est généralement nommée Program.

Conseil

Les exemples de cet article vous offrent un premier aperçu sur du code en C#. Certains exemples peuvent afficher des éléments de C# que vous n’êtes pas familiarisé avec. Lorsque vous êtes prêt à découvrir C#, commencez par nos tutoriels pour débutants ou explorez les liens dans chaque section. Si vous êtes expérimenté en Java, JavaScript, TypeScript ou Python, lisez nos conseils pour vous aider à trouver les informations dont vous avez besoin pour apprendre rapidement C#.

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 en C# tirent profit de la gestion automatique de mémoire de Runtime .NET. 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 charge de travail unique, tels que les bibliothèques web ASP.NET Core ou la bibliothèque d’interface utilisateur .NET Multi-Platform App UI. Un écosystème open source enrichi 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 de modification vous indiquent si vous utilisez ce type de manière 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 un nombre différent de 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.

Fonctionnalités distinctes de C#

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

C# fournit des critères spéciaux. Ces expressions vous permettent d’inspecter des données et de prendre des décisions en fonction de leurs caractéristiques. Les critères spéciaux offrent une excellente syntaxe pour un flux de contrôle basé sur les données. Le code suivant montre comment vous pouvez exprimer des méthodes pour les valeurs booléennes , , ou , et les opérations xor en utilisant la syntaxe des critères spéciaux :

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 expressions de langages de critères spéciaux peuvent être simplifiées en utilisant _ comme attrape-tout pour des valeurs quelconques. 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.

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 qui peuvent être initialisés à 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.

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 appelants peuvent itérer la collection en utilisant une 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.