C# ( en anglais britannique) est un langage de programmation orientée objet, commercialisé par Microsoft depuis 2002 et destiné à développer sur la plateforme Microsoft .NET, au même titre que d’autres langages liés à cette plateforme ( VB .NET, J#).

C# est dérivé du C++ et très proche du Java dont il reprend la syntaxe générale ainsi que les concepts, y ajoutant des notions telles que la surcharge des opérateurs, les et les . Il est utilisé notamment pour développer des applications web sur la plateforme ASP.NET, ainsi que des jeux vidéo avec les moteurs de jeux Unity et Godot..

Présentation C# est un langage de programmation orientée objet, fortement typé, dérivé de C et de C++, ressemblant au langage Java Balagurusamy, Programming In C#, Tata McGraw-Hill Education - 2008,.. Il est utilisé pour développer des applications web, ainsi que des applications de bureau, des services web, des commandes, des widgets ou des bibliothèques de classes. En C#, une application est un lot de classes où une des classes comporte une méthode , comme cela se fait en Java.

C# est destiné à développer sur la plateforme .NET, une pile technologique créée par Microsoft pour succéder à COM.

Les exécutables en C# sont subdivisés en assemblies, en namespaces, en classes et en membres de classe Anders Hejlsberg - Mads Torgersen - Scott Wiltamuth - Peter Golde, The C# Programming Language (Covering C# 4.0), Portable Documents, Addison-Wesley Professional - 2010,.. Un assembly est la forme compilée, qui peut être un programme (un exécutable) ou une bibliothèque de classes (une dll). Un assembly contient le code exécutable en CIL, ainsi que les symboles. Le code CIL est traduit en langage machine au moment de l'exécution par la fonction just-in-time de la plateforme .NET.

Plateforme .NET C# est destiné à développer sur la plateforme .NET. Le cœur de cette pile technologique est le framework .NET, composé de : les environnements ASP.NET et Winforms (qui servent à exécuter respectivement des applications web et de bureau) conçus pour la plateforme .NET ; une bibliothèque de classes qui permet de manipuler des fichiers, manipuler des tableaux ou des structures en arbres, accéder à Internet, créer des interfaces graphiques, accéder à des bases de données, accéder au registre Windows et beaucoup d'autres choses. La plupart des fonctionnalités sont offertes par des classes de l'espace de noms ;

le Common Language Runtime (abr. CLR) est le runtime utilisé par les langages de la plateforme .NET (C#, Visual Basic .NET, J#, etc.), les services fournis par la CLR sont le lancement et l'exécution de programmes, le ramasse-miettes et la gestion d'exceptions. Un programme pour la plateforme .NET est tout d'abord compilé en une forme intermédiaire, le CIL, puis ce code CIL est transformé en code machine qui sera exécuté par la CLR. Ce code machine est appelé parce que son exécution est sous le contrôle de la CLR.

Un autre produit de la plateforme .NET est l'environnement de développement Visual Studio .NET, outil généralement utilisé pour programmer en C#.

Caractéristiques C# est un langage dérivé du C++, il apporte un typage sûr, ainsi que les possibilités d'encapsulation, d'héritage et de polymorphisme des langages orientés objet. En C# tous les types sont des objets. Le langage comporte un ramasse-miettes et un système de gestion d'exceptions.

Le typage sûr signifie notamment que les opérations suivantes sont refusées : utilisation de variable non initialisée, tentative d'accéder au-delà des limites d'un tableau, conversions de type dont les résultats ne sont pas prévisibles, dépassement des limites lors d'opérations arithmétiques.

Beaucoup de possibilités de Java se retrouvent dans C# et il y a une forte ressemblance entre un code écrit en C# et le code équivalent en Java.

En C# les variables peuvent être d'un type valeur ou d'un type référence. Les types valeur sont les types primitifs, les énumérations, les et les types nullable. Les types référence sont les classes, les interfaces, les tableaux et les .

Types primitifs Les types primitifs sont sbyte, short, int, long, byte, ushort, uint, ulong, char, float, double, decimal et bool.

class Les constructions les plus fondamentales du langage C# sont les classes. Celles-ci peuvent contenir des constantes, des champs, des propriétés, des indexeurs, des méthodes, des événements, des opérateurs, des constructeurs, des destructeurs ou des sous-classes. Les classes élémentaires sont et object.

struct Les struct sont similaires aux classes, mais ce sont des types valeurs et ils ne peuvent pas être hérités.

delegate Un delegate est une référence à une méthode qui comporte certains paramètres. Les delegates permettent d'assigner des méthodes à des variables et les passer en paramètre.

enum Un type énuméré est un type valeur qui comporte un lot de constantes. Chaque type énuméré a un type sous-jacent : un type primitif déterminé en fonction des valeurs des constantes.

type nullable Les nullable sont des types primitifs qui peuvent en plus avoir la valeur null. Chaque type primitif T a un type nullable associé T?. Par exemple une variable de type int? peut contenir un int ou null.

Syntaxe Exemple de code :

using System;

public class HelloWorld { public static void Main(string[] args)

Console.WriteLine("Salut tout le monde!");

}Exemple en .NET 10 using System;

// Ecris Bonjour, le monde dans la console Console.WriteLine("Bonjour, tout le monde !"); Mots clé Les mots clé de C# 1.0 sont : abstract class event if new readonly as const explicit implicit null ref base continue extern in object return bool decimal false int operator sbyte break default finally interface out sealed byte delegate fixed internal override short case do float is params sizeof catch double for lock private stackalloc char else foreach long protected static checked enum goto namespace public string

struct throw typeof unchecked using volatile switch true uint unsafe virtual while this try ulong ushort void Mark Michaelis - Eric Lippert, Essential C# 6.0, Addison-Wesley Professional - 2015,.

Les mots clés ajoutés entre C# 2.0 et 6.0 : add dynamic join select alias equals let set ascending from nameof value async get on var await global orderby where by group partial when descending into remove yield

La syntaxe de C# permet de réaliser des chaînes de caractères numériques dont le format est modifiable., notamment avec TimeSpan pour la réalisation de chronomètre ou minuteur..

Différences avec le C++

Le langage compte un certain nombre de changements par rapport au C/C++ ; on notera particulièrement les points suivants : la manipulation directe de pointeurs ne peut se faire qu’au sein d’un code marqué , et seuls les programmes avec les permissions appropriées peuvent exécuter des blocs de code . La plupart des manipulations de pointeurs se font via des références sécurisées, dont l’adresse ne peut être directement modifiée, et la plupart des opérations de pointeurs et d’allocations sont contrôlées contre les dépassements de mémoire. Les pointeurs ne peuvent pointer que sur des types de valeurs, les types objets, manipulés par le ramasse-miettes, ne pouvant qu’être référencés ; les objets ne peuvent pas être explicitement détruits. Le ramasse-miettes s’occupe de libérer la mémoire lorsqu’il n’existe plus aucune référence pointant sur un objet. Toutefois, pour les objets gérant des types non managés, il est possible d’implémenter l’interface IDisposable pour spécifier des traitements à effectuer au moment de la libération de la ressource ; l’héritage multiple de classes est interdit, mais une classe peut implémenter un nombre illimité d’interfaces, et une interface peut hériter de plusieurs interfaces ; le C# est beaucoup plus typé que le C++ ; les seules conversions implicites sont celles entre les différentes gammes d’entiers et celles d’un type dérivé à un type parent. Aucune conversion implicite n’a lieu entre booléens et entiers, entre membres d’énumération et entiers, ni de pointeurs sur un type (quoique pour ce dernier point l’utilisation de références sur le type Object permette d’obtenir le même effet). Les conversions définies par l’utilisateur peuvent être définies comme implicites ou explicites ; la syntaxe pour la déclaration des tableaux n’est pas la même : int[] a = new int remplace int a. Car il s'agit d'une allocation dynamique, int[] a étant la déclaration d'une référence (nulle si non initialisée). L'allocation manuelle d'un tableau sur la pile reste cependant possible avec le mot clé stackalloc. ; les membres d’une énumération sont rassemblés dans leur propre espace de noms ; le C# ne gère pas les , mais cette fonctionnalité a été remplacée par les types génériques apparus avec C# 2.0 ; les propriétés ont été introduites, et proposent une syntaxe spécifique pour l’accès aux données membres (ainsi que la facilitation de l’accès simultané par plusieurs ) ; la réflexion totale des types est disponible ; les délégués, qui sont des listes de pointeurs sur fonctions, sont utilisés notamment pour la programmation événementielle.

Différences avec le Java

Bien que le C# soit similaire à Java, il existe des différences notables, par exemple :

Java n'autorise pas la surcharge des opérateurs ; Java a des exceptions vérifiées, alors que les exceptions du C# ne sont pas vérifiées, comme en C++ ; Java permet la génération automatique de la documentation HTML à partir des fichiers sources à l'aide des descriptions Javadoc-syntax, tandis que le C# utilise des descriptions fondées sur le XML ; Java n'a pas de langage préprocesseur ; C# prend en charge les indexeurs, les méthodes déléguées, et les événements (là où Java se contente du patron de conception observateur) ; C# ne prend pas en charge les implémentations anonymes d'interfaces et de classes abstraites ; C# ne prend en charge que les classes internes statiques ; C# prend en charge les structures en plus des classes (les structures sont des types valeur : on stocke le contenu et non l'adresse) ; C# utilise une syntaxe intégrée au langage (DllImport.) et portable pour appeler une bibliothèque native, tandis que Java utilise ; C# intègre la généricité et la machine .NET a été modifiée pour permettre cela (Java l'intègre également, mais son implémentation a été réalisée dans le compilateur javac sans changer le bytecode Java) Support du cours de sous-typage du MPRI, et 70-89..

Histoire C'est en que la plateforme .NET et C# sont présentés au public. C# devient le langage de facto de cette plateforme, il a par ailleurs été utilisé pour implémenter une partie de la plateforme .NET.

Versions Année Version Bibliothèque Principal changement 2002 1.0 .NET framework 1.0 et 1.1 2005 2.0 .NET framework 2.0 généricité ajoutée à C# et au framework 2008 3.0 .NET framework 3.5 LINQ (Language INtegrated Queries) 2010 4.0 .NET framework 4.0 types dynamiques 2012 5.0 .NET framework 4.5 méthodes asynchrones 2015 6.0 .NET framework 4.6 version pour Linux 2017 7.0 - 7.3 .NET framework >= 4.5 et .NET Core 2.X Tuples, fonctions locales20198.0.NET standard >=2.1 et .NET Core >=3.0Membre ReadOnly, opérateur d’assignation de fusion20209.0.NET 5.0Vérification de nullité, instructions de niveau racine202110.0.NET 6.0Directives d’utilisation globale, modèles de propriété étendus202211.0.NET 7.0Attributs générique, membre requis, chaîne brute202312.0.NET 8.0Simplification de code202413.0.NET 9.0Amélioration params, lock202514.0.NET 10.0Mot clé field, affectation conditionnelle en cas de null

C# 2.0

Microsoft mit à disposition du public en , après une longue période de beta-tests, la version 2.0 de la bibliothèque .NET, accompagnée d’une nouvelle version de la quasi-totalité des outils associés. C# ne fait pas exception à la règle et sort donc en version 2.0, avec les ajouts suivants : les classes partielles, permettant de répartir l’implémentation d’une classe sur plusieurs fichiers ;