C Sharp
C# (C sharp [siË.ÊÉËp] en anglais britannique) est un langage de programmation orientĂ©e objet, commercialisĂ© par Microsoft depuis 2002[2] et destinĂ© Ă dĂ©velopper sur la plateforme Microsoft .NET.
C# | ||
Date de premiĂšre version | ||
---|---|---|
Paradigme | Structuré, impératif, orienté objet | |
Auteur | Microsoft | |
DerniĂšre version | 11.0 ()[1] | |
Typage | Statique, fort, nominatif | |
Dialectes | 1.0, 1.1, 1.2, 2.0 (ECMA), 3.0, 3.5, 4.0, 5.0, 6.0, 7.0, 7.1, 7.2, 7.3, 8.0, 9.0, 10.0 | |
Influencé par | C++, Java | |
A influencé | Swift, Vala, F#, Kotlin, TypeScript | |
Implémentations | Microsoft .NET, Mono, DotGNU | |
SystĂšme d'exploitation | Multiplate-forme | |
Site web | docs.microsoft.com/en-us/dotnet/csharp, docs.microsoft.com/de-de/dotnet/csharp, docs.microsoft.com/ja-jp/dotnet/csharp, docs.microsoft.com/fr-fr/dotnet/csharp et docs.microsoft.com/it-it/dotnet/csharp | |
Extension de fichier | .cs | |
Il 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 indexeurs (en) et les délégués. Il est utilisé notamment pour développer des applications web sur la plateforme ASP.NET, ainsi que des jeux vidéo avec le moteur de jeux Unity.
Présentation
C# est un langage de programmation orientĂ©e objet, fortement typĂ©, dĂ©rivĂ© de C et de C++, ressemblant au langage Java[2]. 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[2]. En C#, une application est un lot de classes oĂč une des classes comporte une mĂ©thode Main, comme cela se fait en Java[2].
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[3]. 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 MSIL, ainsi que les symboles. Le code MSIL est traduit en langage machine au moment de l'exĂ©cution par la fonction just-in-time de la plateforme .NET[3].
Plateforme .NET
C# est destinĂ© Ă dĂ©velopper sur la plateforme .NET. Le cĆur de cette pile technologique est le framework .NET, composĂ© de[2]:
- Les environnements ASP.NET et Winforms qui servent à exécuter des applications web, resp. de bureau conçus pour la plateforme .NET[2].
- 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 System[2].
- 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 MSIL, puis ce code MSIL est transformé en code machine qui sera exécuté par la CLR. Ce code machine est appelé managed code parce que son exécution est sous le contrÎle de la CLR[2].
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#[2].
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[2]. En C# tous les types sont des objets[2]. Le langage comporte un ramasse-miettes et un systÚme de gestion d'exceptions[2].
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[2].
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[2].
En C# les variables peuvent ĂȘtre d'un type rĂ©fĂ©rence ou d'un type valeur. Les types valeur sont les types primitifs, les Ă©numĂ©rations, les struct et les types nullable[3]. Les types rĂ©fĂ©rence sont les classes, les interfaces, les tableaux et les delegate[3].
- Types primitifs
Les types primitifs sont sbyte, short, int, long, byte, ushort, uint, ulong, char, float, double, decimal et bool[3].
- 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[3]. Les classes élémentaires sont string et object[3].
- struct
Les struct sont similaires aux classes, mais ce sont des types valeurs et ils ne peuvent pas ĂȘtre hĂ©ritĂ©s[3].
- 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[3].
- 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[3]. Chaque type primitif T a un type nullable associé T?. Par exemple une variable de type int? peut contenir un int ou null[3].
Syntaxe
using System;
public class HelloWorld
{
public static void Main(string[] args)
{
Console.WriteLine("Hello world!");
}
}
- 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
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[5], notamment avec TimeSpan pour la réalisation de chronomÚtre ou minuteur[6].
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Ă© unsafe, et seuls les programmes avec les permissions appropriĂ©es peuvent exĂ©cuter des blocs de code unsafe. 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 void (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[5]
remplaceint a[5]
. 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
[7] ; - les membres dâune Ă©numĂ©ration sont rassemblĂ©s dans leur propre espace de noms ;
- le C# ne gÚre pas les templates, 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 threads) ;
- 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 Java Native Interface ;
- 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). Plus de dĂ©tails sur l'aspect thĂ©orique de cette rĂ©alisation peuvent ĂȘtre trouvĂ©s dans la rĂ©fĂ©rence[8], diapositives 70 Ă 89.
Histoire
C'est en septembre 2002 que la plateforme .NET et C# sont présentés au public[2]. C# devient le langage de facto de cette plateforme, il a par ailleurs été utilisé pour implémenter une partie de la plateforme .NET[2].
- 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 |
2016 | 7.0 | .NET framework >= 4.5 | Tuples, fonctions locales |
2019 | 8.0 | .NET standard >=2.1 et .NET Core >=3.0 | Membre ReadOnly, opĂ©rateur dâassignation de fusion |
2020 | 9.0 | .NET 5.0 | Vérification de nullité, instructions de niveau racine |
2021 | 10.0 | .NET 6.0 | Directives dâutilisation globale, modĂšles de propriĂ©tĂ© Ă©tendus |
2022 | 11.0 | .NET 7.0 |
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.
- Les types gĂ©nĂ©riques, qui ne sont pas une simple copie des templates C++. Par exemple, on trouvera dans les gĂ©nĂ©riques C# la restriction de types (pour spĂ©cifier les types utilisables dans une gĂ©nĂ©ralisation). Par contre, il est impossible dâutiliser des expressions comme paramĂštres pour la gĂ©nĂ©ralisation.
- Un nouvel itĂ©rateur qui permet lâutilisation de coroutines via le mot-clĂ©
yield
, Ă©quivalent duyield
que lâon trouve en Python. - Les mĂ©thodes anonymes avec des rĂšgles de fermeture configurables.
- Les types « nullables », c'est-Ă -dire la possibilitĂ© de spĂ©cifier quâun type de valeur peut ĂȘtre nul. Ceux-ci sont dĂ©clarĂ©s avec le caractĂšre point d'interrogation « ? » suivant le nom du type, comme ceci :
int? i = null;
. - Le nouvel opérateur double point d'interrogation « ?? » utilise deux opérandes et retourne le premier non nul. Il a été introduit pour spécifier une valeur par défaut pour les types « nullables ».
à titre de référence, les spécifications complÚtes des nouveautés introduites dans la version 2.0 sont disponibles dans les liens externes.
Anders Hejlsberg, le pĂšre de Delphi, sâest exprimĂ© sur lâimplĂ©mentation des gĂ©nĂ©riques dans C#, Java et C++ dans cette interview (en).
La fonctionnalitĂ© des types nullables fut corrigĂ©e quelques semaines seulement avant la sortie publique de la version 2.0, car il a Ă©tĂ© mis en lumiĂšre que si la valeur de la variable Ă©tait bien nulle, cette variable nâĂ©tait pas nulle au sens traditionnel du terme, c'est-Ă -dire quâil ne sâagit pas dâune rĂ©fĂ©rence vide. Ainsi, la conversion dâun type primitif de valeur nulle en objet donnait une rĂ©fĂ©rence non nulle vers une valeur nulle. Il fallut donc, pour corriger ce problĂšme, corriger le noyau du CLR et effectuer de nombreuses vĂ©rifications et corrections sur tous les produits de la gamme .NET 2.0 (Visual Studio 2005, SQL Server 2005, C# et VB.NET).
C# 3.0
Le C# 3.0 fut présenté au salon PDC 2005. La version finale est disponible depuis le au téléchargement sur le site de Microsoft (en) . Les principales nouveautés sont les suivantes :
- Lâajout des mots-clefs
select
,from
etwhere
pour permettre la formation et lâexĂ©cution de requĂȘtes SQL, XML, ou directement sur des collections. Cette fonctionnalitĂ© fait partie du programme Language Integrated Query (LINQ) (en). - Nouvelle possibilitĂ© dâinitialisation d'un objet : Ă la place de
Client c = new Client(); c.Nom = "Dupont";
, on peut utiliserClient c = new Client{ Nom = "Dupont" };
- Expressions lambda :
ListeTrucs.Where( delegate(Truc x) { return x.Size > 10; } );
devientListeTrucs.Where( x => x.Size > 10 );
- Inférence du type des variables locales :
string s = "Dupont"
peut ĂȘtre remplacĂ© parvar s = "Dupont"
- Introduction des types anonymes :
var x = new { Nom = "Dupont" }
peut ĂȘtre utilisĂ© Ă la place declass __anonymous { private string _nom; public string Nom { get { return _nom; } set { _nom = value; } } } __anonymous x = new __anonymous(); x.Nom = "Dupont";
- Les arbres d'expressions (expression trees) : permettent la compilation du code sous formes d'arbres d'objets facilement analysables et manipulables.
- Méthodes étendues : permet d'ajouter des méthodes à une classe en y ajoutant un premier paramÚtre
this
.
Une prĂ©sentation du C# 3.0 et de LINQ peut ĂȘtre trouvĂ©e sur la page du centre de dĂ©veloppement de .NET Framework.
Le code compilĂ© en C# 3.0 est entiĂšrement compatible avec celui du 2.0, Ă©tant donnĂ© que les amĂ©liorations apportĂ©es ne sont que purement syntaxiques ou ne consistent quâen des raccourcis compensĂ©s au moment de la compilation. Les nouveautĂ©s introduites dans les bibliothĂšques de la version 3.5 (LINQ, etc.) ne sont cependant pas utilisables avec les versions prĂ©cĂ©dentes de C#.
Cette version exige Windows XP ou une version supérieure (Vista ou Windows 7). Elle n'est pas disponible pour Windows 2000.
C# 4.0
La version 4 du langage apporte plusieurs nouveautés :
- le typage dynamique des variables à l'aide du mot clé
dynamic
; - les arguments nommés et facultatifs[9] ;
- la prise en charge de la covariance et de la contravariance pour les interfaces et les délégués génériques.
Le framework .NET 4.0 est sorti le , accompagné de Visual Studio 2010[10]. Il propose entre autres :
- la nouvelle bibliothĂšque parallĂšle : Task Parallel Library ;
- une version optimisée de la plate-forme entité d'accÚs aux bases de données (Entity Framework) via l'utilisation de LINQ ;
- la version parallÚle de LINQ appelée PLINQ.
C# 5.0
La version 5 du langage permet de programmer plus simplement des programmes asynchrones grùce à l'ajout des mots clés async
et await
.
Le comportement des closures dans la boucle foreach
a été modifié. Il n'est désormais plus nécessaire d'introduire une variable locale dans une boucle foreach
pour Ă©viter les problĂšmes de closure[11].
à noter également les informations relatives à l'appelant[12] permettant de connaßtre le nom de la méthode qui a appelé une propriété.
C# 6.0
La sixiĂšme version du C# apporte plusieurs modifications, notamment :
Les propriétés implémentées automatiquement (ou propriétés automatiques) sont apparues en C# 3, pour simplifier la déclaration de propriétés qui se contentent d'encapsuler l'accÚs à des champs. Bien qu'elles permettent de rendre le code plus concis, elles présentent un inconvénient : il n'est pas possible de les initialiser au niveau de la déclaration, il faut forcément le faire dans le constructeur. De plus, il n'est pas possible de faire des propriétés automatiques en lecture seule, puisqu'elles n'ont pas de mutateur (setter) et on ne pourrait donc pas leur affecter de valeur.
C# 6 remédie à ce problÚme en permettant d'initialiser les propriétés automatiques au niveau de la déclaration[13].
Standardisation
Le C# a été normalisé par l'ECMA (ECMA-334) en et par l'ISO/CEI (ISO/CEI 23270) en 2003.
Les modifications survenues dans la Version 2.0 ont été normalisées par l'ECMA (ECMA-334) en et par l'ISO/CEI (ISO/CEI 23270:2006) en .
Microsoft a ouvert le code source de certaines bibliothÚques utilisées par le C# en sous la licence Microsoft Reference Source License (MS-RSL)[14].
Nom du langage
Le standard ECMA 334 et l'ISO 23270 définissent le nom du langage comme le caractÚre Unicode 0043 (C majuscule) suivi du caractÚre 0023 (#)[15]. Il est prononcé « C sharp » et non « C hash », « sharp » désignant en effet le symbole musical ⯠mais # étant nécessaire pour un accÚs facile depuis un clavier d'ordinateur qui propose le croisillon (« hash ») à la place.
Le nom "C#" est inspirĂ© de la notation musicale oĂč un diĂšse indique que la note Ă©crite doit ĂȘtre augmentĂ©e d'un demi-ton. Ceci est similaire au nom de langage de C++, oĂč "++" indique qu'une variable doit ĂȘtre incrĂ©mentĂ©e de 1 aprĂšs avoir Ă©tĂ© Ă©valuĂ©e. Le symbole # ressemble Ă©galement Ă une ligature de quatre symboles "+" (dans une grille deux par deux), ce qui implique que le langage est un incrĂ©ment de C++.
Voir aussi
- Ăditeur de texte
- W3Schools
- Roslyn (compilateur) (en)
Annexes
Liens externes
Bibliographie
- C# et .NET - GĂ©rard Leblanc - 2002 - Ăditions Eyrolles - (ISBN 2-212-11066-9)
- C# et .NET Version 2 - GĂ©rard Leblanc - 2006 - Ăditions Eyrolles - (ISBN 2-212-11778-7)
- C# TĂȘte la premiĂšre - Andrew Stellman, Jennifer Greene - 2008 - Ăditions Digit Books - (ISBN 978-2-81500-001-7)
- Introduction Ă C# - Pierre-Yves Saumont, Antoine Mirecourt - 2001 - Ăditions Eyrolles - (ISBN 2-7464-0301-3)
- Le guide de survie C# - Gilles Tourreau - 2010 - Ăditions Pearson Education - (ISBN 978-2-7440-2432-0)
- (en) C# 2005 Programmer's Reference - Adrian Kingsley-Hughes, Kathie Kingsley-Hughes - 2006 - Ădition Wrox - (ISBN 0-470-04641-4)
- (en) C# Essentials, 2nd Edition - Ben Albahari, Peter Drayton, Brad Merrill - 2002 - Ădition O'Reilly Media - (ISBN 0-596-00315-3)
- (en) Professional C#, 3rd Edition - Simon Robinson, Christian Nagel, Karli Watson, Jay Glynn, Morgan Skinner, Bill Evjen - 2004 - Ădition Wrox - (ISBN 0-7645-5759-9)
Notes et références
- « Welcome to C# 11 » (consulté le )
- (en)Balagurusamy, Programming In C#, Tata McGraw-Hill Education - 2008, (ISBN 9780070667570)
- (en)Anders Hejlsberg - Mads Torgersen - Scott Wiltamuth - Peter Golde, The C# Programming Language (Covering C# 4.0), Portable Documents, Addison-Wesley Professional - 2010, (ISBN 9780132481724)
- (en)Mark Michaelis - Eric Lippert, Essential C# 6.0, Addison-Wesley Professional - 2015, (ISBN 9780134176130)
- (en) « Custom numeric format strings », sur microsoft.com (consulté le ).
- (en) « Custom TimeSpan format strings », sur microsoft.com (consulté le ).
- (fr) Site MSDN
- (en) Support du cours de sous-typage du MPRI[PDF], diapositives 73 Ă 80.
- http://msdn.microsoft.com/fr-fr/library/vstudio/dd264739(v=vs.100).aspx
- (en) Site MSDN.
- http://blogs.msdn.com/b/ericlippert/archive/2009/11/12/closing-over-the-loop-variable-considered-harmful.aspx
- http://msdn.microsoft.com/fr-fr/library/hh534540.aspx
- Thomas Levesque, « Les nouveautés de C# 6 » (consulté le ).
- Microsoft Reference Source License (MS-RSL)
- ECMA 334, p. 11