Share 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.

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#.

L’exemple précédent montre une forme de programme « Hello, World » utilisant les instructions de niveau supérieur. Les versions plus anciennes de C# exigeaient que vous définissiez le point d’entrée du programme dans une méthode. Ce format est toujours valide et vous le voyez dans plusieurs exemples de C# existants. Vous devez également connaître ce formulaire, tel qu’illustré dans l’exemple suivant :

using System;

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

Cette version montre les blocs de construction que vous utilisez dans vos programme. Le programme « Hello, World » commence par une directive using qui fait référence à l’espace de noms System. 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 Hello 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#.

Les deux formulaires de point d’entrée génèrent un code équivalent. Lorsque vous utilisez des instructions de niveau supérieur, le compilateur synthétise la méthode et la classe conteneur pour le point d’entrée du programme.

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 ne connaissez pas. Lorsque vous êtes prêt à découvrir C#, commencez par nos tutoriels pour débutants ou explorez les liens dans chaque section. Si vous connaissez Java, JavaScript, TypeScript ou Python, parcourez nos conseils pour vous permettre de rechercher les informations dont vous avez besoin pour apprendre C# rapidement.

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# se trouve dans la famille C des langages. La syntaxe en C# vous est connue si vous utilisez C, C++, JavaScript ou Java. Comme les autres langages de la famille 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.

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. Vous connaîtrez cette pratique si vous utilisez 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. 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);
}

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,
    };

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.