De titel van deze pagina kan door technische beperkingen niet correct worden weergegeven alsC#. Dit artikel artikel gaat over de programmeertaal, voor de muzieknoot die ook wordt weergegeven alsC# zieCis.
De taal is geïnspireerd doorC. De naam is een verwijzing naar de muziek: een toon die een halve toon hoger is dan eenC heet C# (Engelse uitspraak:C sharp). In het Nederlands zou datCis zijn.
C# is ontworpen door Anders Hejlsberg en het ontwikkelingsteam wordt momenteel[(sinds) wanneer?] geleid door Mads Torgersen.
De taal en implementaties daarvan zouden ondersteuning moeten bieden voor software-engineeringprincipes zoals sterke typecontrole, controle van arraygrenzen, detectie van pogingen om niet-geïnitialiseerde variabelen te gebruiken en automatischegarbage collection. Robuustheid vansoftware, duurzaamheid en productiviteit van programmeurs zijn belangrijk.
De taal is bedoeld voor gebruik bij het ontwikkelen van softwarecomponenten die geschikt zijn voor implementatie in gedistribueerde omgevingen.
Draagbaarheid is erg belangrijk voorbroncode en programmeurs, vooral degenen die al bekend zijn met C en C++.
C# is bedoeld om geschikt te zijn voor het schrijven van applicaties voor zowel gehoste alsgeïntegreerde systemen, variërend van zeer grote die geavanceerdebesturingssystemen gebruiken, tot zeer kleine met speciale functies.
Hoewel C#-toepassingen bedoeld zijn om zuinig te zijn met betrekking tot geheugen- en verwerkingsvermogenvereisten, was de taal niet bedoeld om rechtstreeks te concurreren op prestaties en grootte met C ofassembleertaal.
Tijdens de ontwikkeling van het .NET-framework werden de klassenbibliotheken oorspronkelijk geschreven met behulp van een beheerdecode-compilersysteem genaamd"Simple Managed C" (SMC).[3][4] In januari 1999 vormdeAnders Hejlsberg een team om een nieuwe taal te bouwen genaamd Cool, wat stond voor "C-like Object Oriented Language".[5] Microsoft had overwogen de naam "Cool" te behouden als de definitieve naam van de taal, maar koos ervoor dit niet te doen vanwege handelsmerkredenen. Tegen de tijd dat het .NET-project publiekelijk werd aangekondigd op deProfessionele Developers Conference van juli 2000, was de taal omgedoopt tot C#, waarbij de klassenbibliotheken en deASP.NET-runtime waren geporteerd naar C#.
Hejlsberg is de belangrijkste ontwerper en hoofdarchitect van C# bij Microsoft, en was eerder betrokken bij het ontwerp vanTurbo Pascal,Embarcadero Delphi (voorheen CodeGear Delphi, Inprise Delphi en Borland Delphi) enVisual J++. In interviews en technische artikelen heeft hij verklaard dat gebreken[6] in de meeste belangrijke programmeertalen (bijv.C++,Java,Delphi enSmalltalk) de basis waren voor deCommon Language Runtime (CLR), die op zijn beurt het ontwerp van de C#-taal zelf vormde.
James Gosling, die de programmeertaal Java in 1994 creëerde, enBill Joy, medeoprichter vanSun Microsystems, de grondlegger van Java, noemde C# een "imitatie" van Java; Gosling zei verder dat "[C#] een soort Java is waarvan de betrouwbaarheid, productiviteit en beveiliging zijn verwijderd."[7][8] Klaus Kreft en Angelika Langer (auteurs van een C++ streams-boek) verklaarden in een blogpost dat "Java en C# bijna identieke programmeertalen zijn. Saaie herhaling zonderinnovatie".[9] "Bijna niemand zal beweren dat Java of C# revolutionaire programmeertalen zijn die de manier waarop we programma's schrijven hebben veranderd" en "C# leende veel van Java - en vice versa. Nu C#boxing en unboxing ondersteunt, hebben we zeer veel vergelijkbare functies als in Java."[9] In juli 2000 zei Hejlsberg dat C# "geen Java-kloon is en veel dichter bij C++ ligt in zijn ontwerp. C# leent de meeste van zijn operators, keywords en statements direct van C++, we hebben gekeken naar Java, naar Modula 2, C en we keken naar Smalltalk. We hebben ook een aantal taaleigenschappen die Java niet overgenomen heeft, waarom zijn er bijvoorbeeld geen enums in Java? We hebben ook operator overloading en typeconversies, ook ligt onze complete structuur voor namespaces veel dichter tegen C++ aan".[10]
Sinds de release van C# 2.0 in november 2005 zijn de C#- en Java-talen geëvolueerd op steeds meer uiteenlopende trajecten, en zijn ze twee behoorlijk verschillende talen geworden. Een van de eerste grote verschuivingen kwam met de toevoeging vangenericiteit aan beide talen, met enorm verschillende implementaties. C# maakt gebruik vanreïficatie om "eersteklas" generieke objecten te leveren die kunnen worden gebruikt zoals elke andere klasse, waarbij codegeneratie wordt uitgevoerd tijdens het laden van de klasse.[11] Bovendien heeft C# verschillende belangrijke functies toegevoegd om het programmeren infunctionele stijl mogelijk te maken, met als hoogtepunt deLINQ-extensies die zijn uitgebracht met C # 3.0 en het ondersteunende raamwerk vanlambda-expressies, uitbreidingsmethoden, enanonieme typen.[12] Deze functies stellen C -programmeurs in staat functionele programmeertechnieken te gebruiken, zoalssluitingen, wanneer dit voordelig is voor hun toepassing. De LINQ-extensies en de functionele import helpen ontwikkelaars de hoeveelheid standaardcode te verminderen die is opgenomen in veelvoorkomende taken zoals het opvragen van eendatabase, het ontleden van eenXML-bestand of het doorzoeken van een datastructuur, waarbij de nadruk wordt verschoven naar de eigenlijke programmalogica om de leesbaarheid te verbeteren en onderhoudbaarheid.
C# had vroeger een mascotte genaamd Andy (genoemd naar Anders Hejlsberg). Die is op 29 januari 2004 gestopt.
C# was oorspronkelijk ter beoordeling voorgelegd aan de ISO-subcommissie JTC 1/SC 22, onder ISO / IEC 23270: 2003, werd ingetrokken en werd vervolgens goedgekeurd onder ISO / IEC 23270: 2006.
Microsoft gebruikte de naam C# voor het eerst in 1988 voor een variant van de C-taal die is ontworpen voor incrementele compilatie.[13] Dat project is niet voltooid, maar de naam leefde voort.
De naam is geïnspireerd door de muziek. De tooncis heet in het Engels "C♯", uitgesproken als "c sharp".[14] Dit is vergelijkbaar met de naam van de programmeertaal C++, waar "++" aangeeft dat een variabele na evaluatie met 1 moet worden verhoogd. Hetkruissymbool lijkt ook op een ligatuur van vier "+" symbolen (in een raster van twee bij twee), wat verder impliceert dat de taal een toename is van C++.
Vanwege technische beperkingen van weergave (standaard fonts, browsers etc.) en het feit dat het kruis niet aanwezig op de meeste toetsenborden (U+266F ♯ MUSIC SHARP SIGN (HTML♯ of♯)), werd hetnummerteken of hekje (U+0023 # NUMBER SIGN (HTML# of#)) gekozen om het kruis in de geschreven naam van de programmeertaal te benaderen. Deze conventie wordt weerspiegeld in de ECMA-334-C#-taalspecificatie.
Het achtervoegsel "sharp" is gebruikt door een aantal andere .NET-talen die varianten zijn van bestaande talen, waaronderJ# (een .NET-taal die ook is ontworpen door Microsoft en is afgeleid van Java 1.1),A♯ (van Ada) en de functionele programmeertaal taalF#. De oorspronkelijke implementatie van Eiffel voor .NET heetteEiffel♯, een naam die weer opgedoekt is omdat de volledige taal vanEiffel nu wordt ondersteund. Het achtervoegsel is ook gebruikt voor bibliotheken, zoalsGtk# (een.NET- wrapper voorGTK+ en andereGNOME-bibliotheken) en Cocoa# (een wrapper voorCocoa).
Overerving: zoals inJava is er een onderscheid tusseninterfaces, die alleen methodedeclaraties bevatten, enklassen, die methoden kunnen implementeren, en kan een klasse maar van één andere klasse overerven, maar meerdere interfaces implementeren. In C++ wordt dit onderscheid niet gemaakt en ismultiple inheritance van klassen mogelijk.
bool: er is geen impliciete conversie tussen bool en int zoals bij C++. Conversies kunnen – net als bij C++ en Java – worden uitgevoerd met behulp vantypecasting. Een Boolean is eenvalue type. Daarnaast kunnen bij C# "primitieve" types als int en bool worden aangesproken als een object (boxing), waardoor een conversie als 5.ToString() mogelijk is; Java heeft dit tegenwoordig ook.
struct: C# (en het .NET-framework) maakt een onderscheid tussenreference types envalue types. Een value type wordt in C# gedeclareerd alsstruct, een reference type alsclass. Verder hebben ze dezelfde gebruiksmogelijkheden; eenstruct kan bijvoorbeeld eigenschappen en methoden hebben. Het verschil is dat de instantievariabelen van een value type niet gewijzigd kunnen worden (zulke wijzigingen hebben geen effect). Met structs kan worden voorkomen dat zeer veel kleine objecten de overhead van garbage collection met zich meedragen. In C++ zijn de velden van eenstruct wel degelijk te wijzigen. Java kent geen structs.
delegate: Dit zijn type-safe functiepointers. Ze zijn vergelijkbaar met functiepointers in C++ en functionele interfaces in Java.
base en override: base is zoals bij Javasuper en override is zoals bij Java en C++virtual.
Preprocessor directives: Java kent deze helemaal niet, C# alleen#define, waarmee een constante waarde kan worden gedefinieerd, en#if, dat op die waarde test, zodatconditionele compilatie mogelijk is. Niet ondersteund worden expressies in#define,#include, en andere features van de C/C++-preprocessor. De rol van#include in C++ wordt vervuld doorusing in C# (enimport in Java), die verwijzen naar namespaces in plaats van naar broncode.
operators: hier bestaan extra operators ten opzichte van C++, zoals deis,as,?? entypeof, een subset hiervan bestaat ook in Java. C# ondersteunt net als C++operator-overloading; Java niet.
Main: wordt gebruikt om het entry point voor een programma aan te geven, zoals in Java.
argument passing: is in principe zoals in Java: normaal gesproken is hetcall by value, maarref enout kunnen worden gebruikt om parametersby reference door te geven, wat betekent dat een toewijzing aan de argumentvariabele in de aangeroepen code ook de meegegeven variabele wijzigt in de aanroepende code;unsafe wordt gebruikt om inunmanaged code expliciete pointers (dat wil zeggen geheugenadressen) door te geven.
strings: in tegenstelling tot C waar er geen speciale klasse is voor strings, maar een string gewoon een pointer naar een stuk geheugen is waar de string staat, gebruiken C# en Java beide een overkoepelendeString-klasse. Deze zijn meestal 'copy-on-write' en zijn makkelijker aan te passen dan de C-strings. C++ ondersteunt beide methoden.
foreach, in: laat toe om door Xrayarrays encollecties teitereren (waardoor de bij eenfor-lus benodigde expliciete indexvariabele overbodig wordt) maar ook door willekeurigeenumerables, die niet altijd, zoals arrays en collecties, een vooraf vastgelegde reeks elementen hoeven te bevatten; ze komen min of meer overeen met delazy lists uit hetfunctioneel programmeren. Java gebruikt zulke iteratie ook, en heeft sinds versie 1.5 ook deforeach-constructie.
using: wordt gebruikt om naar anderenamespaces te verwijzen zonder dat men telkens de volledige naam moet opgeven. Ook in Java is deze functionaliteit in de vorm van 'packages' aanwezig en kunnen packages geïmporteerd worden met het import-statement. In C bestaat dit niet in de taal, maar wordt het gesimuleerd met depreprocessor, in C++ bestaat dit echter wel in de vorm van 'using namespace'.
Destructor: net zoals bij Java is erautomatic garbage collection, die ervoor zorgt dat de programmeur geen rekening hoeft te houden met het opruimen van het geheugen. In C++ en C moet de programmeur dit wel zelf doen, al bestaan er bibliotheken die er bij kunnen helpen. Het is wel mogelijk in C# om zogenaamde 'unsafe' (unmanaged) code te schrijven met pointers, net als in C++ en C.
Machinecode versusByte code: C# en Java worden beide naar byte-code gecompileerd voor eenvirtuele machine (VM), die ook wel deruntime wordt genoemd, en die eenmalig moet worden opgestart; deze machine zal metJIT (Just-in-time-compilatie) de bytecode eenmalig naar machinecode compileren en laten uitvoeren, en is ook verantwoordelijk voorgarbage collection. Programmatuur in een taal als C++ daarentegen wordt direct naar machinetaal gecompileerd, waarna de gecompileerde programmatuur wordt geïnstalleerd op de machines waar de programmatuur op moet draaien; die programmatuur wordt dan direct door deprocessor uitgevoerd. Het gebruik van de virtuele machine heeft als nadeel de overhead van het opstarten en het (eenmalig) compileren; anderzijds maakt het bepaalde optimalisaties in het compileren mogelijk die bij compilatie vooraf onmogelijk zijn.
DeCommon Intermediate Language (CIL) is de specificatie van de bytecode waar alle .NET-talen naartoe compileren. De CIL-code wordt door deCommon Language Runtime (CLR) at-runtime omgezet naarmachinecode en uitgevoerd. Omdat de CIL-code at-runtime wordt gecompileerd vlak voor deze wordt aangeroepen, spreekt men wel vanJIT (Just In Time)-compilatie. CIL is te vergelijken met de bytecode in Java's .class-bestanden. Ook Java's VM werkt op eenzelfde manier als de CLR van .NET.
CIL heette voorheen MSIL, wat de afkorting was voor Microsoft Intermediate Language, maar is van naam veranderd om in aanmerking te komen alsISO-standaard.
Door zijn flexibiliteit kan C# ook alsscripttaal worden gebruikt. Zo is dit standaard geïmplementeerd inUnity3D[31] en is het ook mogelijk om C# als scripttaal te gebruiken voor deUnreal engine.[32] Ook kan C# als scripttaal worden gebruikt met behulp vancs-script[33] en is het mogelijk C# als scripttaal te gebruiken in applicaties die met C++ zijn geschreven.[34]
Door gebruik te maken vanASP.NET kan C# gebruikt worden als alternatief voorPHP.
↑Kovacs, James,C#/.Net History Lesson(7 september 2007).Gearchiveerd op6 maart 2009.Geraadpleegd op18 juni 2009.
↑(en)Hewlett-Packard, Intel en Microsoft,C# Language Specification(pdf)(december 2002 - 2e editie).Gearchiveerd op31 oktober 2020.Geraadpleegd op11 oktober 2020.