C♯

Uit Wikipedia, de vrije encyclopedie
(Doorverwezen vanaf C sharp)
Ga naar: navigatie, zoeken
C#
Paradigma Multi-paradigmaprogrammeertaal
Verschenen in 2001
Ontwikkeld door Microsoft
Huidige versie 5.0 (augustus 2012)
Typesysteem statisch, sterk
Implementaties .NET Framework, Mono,
Beïnvloed door C++, Java, Eiffel, Modula-3
Invloed op D, Java, Vala, Windows PowerShell
Bestandsextensies .cs
Website (en) C# op de website van Microsoft
Portaal  Portaalicoon   Informatica

De naam is afgeleid van C#, de Engelse naam voor de Cis, dat wil zeggen de met een halve toon verhoogde C.

C# (Engels uitgesproken als "C sharp") is een programmeertaal ontwikkeld door Microsoft als deel van het .NET-initiatief, en later geaccepteerd als standaard door ECMA (ECMA-334) en ISO (ISO/IEC 23270). C# is objectgeoriënteerd en lijkt qua syntaxis en semantiek sterk op Java, maar bevat vooral in latere versies allerlei voorzieningen waardoor ook in andere programmeerstijlen gewerkt kan worden, terwijl vooral in de bibliotheken en programmeeromgeving een sterke invloed van Object Pascal en Delphi te zien is. Dit is niet verrassend, omdat C# onder andere bedoeld is als Microsofts antwoord op Java en omdat Anders Hejlsberg, de ontwerper van Delphi, ook een leidende rol heeft gehad in C# en .NET.

C# is samen met het .NET-framework geïntroduceerd, en wordt beschouwd als de belangrijkste taal voor dat platform.

Naast desktopapplicaties en serverapplicaties (in combinatie met ASP.NET) wordt de taal ook gebruikt voor mobiele apparaten als pda's en smartphones, in combinatie met het .NET Compact Framework.

Versies[bewerken]

Er zijn vijf versies van de taal uitgebracht:

Versie Taalspecificatie Microsoftcompiler
1.0 december 2001 januari 2002
2.0 december 2002 november 2005
3.0 juni 2005 november 2006
4.0 juni 2006 april 2010
5.0 geen augustus 2012

Voorbeeld[bewerken]

Hieronder staat een voorbeeld van een kleine Hello world-applicatie, geschreven in C#:

using System;
public class Hello
{
  static void Main()
  {
    Console.WriteLine("Hello World");
  }
}

Een bronbestand van C# wordt opgeslagen met cs-bestandsextensie, bijvoorbeeld 'Hello.cs'.

Vergelijking met Java en C++[bewerken]

  • Overerving: zoals in Java is er een onderscheid tussen interfaces, die alleen methodedeclaraties bevatten, en klassen, 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 is multiple 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 van typecasting. Een Boolean is een value 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 tussen reference types en value types. Een value type wordt in C# gedeclareerd als struct, een reference type als class. Verder hebben ze dezelfde gebruiksmogelijkheden; een struct 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 een struct wel degelijk te wijzigen. Java kent geen structs.
  • delegate: Dit zijn type-safe function pointers. In Java bestaan delegates niet; hun functionaliteit wordt vaak nagemaakt met een inner class, die een interface met één methode implementeert.
  • base en override: base is zoals bij Java super 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, zodat conditionele 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 door using in C# (en import in Java), die verwijzen naar namespaces in plaats van naar broncode.
  • operators: hier bestaan extra operators ten opzichte van C++, zoals de is, as, ?? en typeof, 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 het call by value, maar ref en out kunnen worden gebruikt om parameters by 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 in unmanaged 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 overkoepelende String-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 Xray arrays en collecties te itereren (waardoor de bij een for-lus benodigde expliciete indexvariabele overbodig wordt) maar ook door willekeurige enumerables, die niet altijd, zoals arrays en collecties, een vooraf vastgelegde reeks elementen hoeven te bevatten; ze komen min of meer overeen met de lazy lists uit het functioneel programmeren. Java gebruikt zulke iteratie ook, en heeft sinds versie 1.5 ook de foreach-constructie.
  • using: wordt gebruikt om naar andere namespaces 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 de preprocessor, in C++ bestaat dit echter wel in de vorm van 'using namespace'.
  • Destructor: net zoals bij Java is er automatic garbage collection, die er voor 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 versus Byte code: C# en Java worden beide naar byte-code gecompileerd voor een virtuele machine (VM), die ook wel de runtime wordt genoemd, en die eenmalig moet worden opgestart; deze machine zal met JIT (Just-in-time-compilatie) de bytecode eenmalig naar machinecode compileren en laten uitvoeren, en is ook verantwoordelijk voor garbage 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 de processor 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.

Common Intermediate Language[bewerken]

De Common Intermediate Language (CIL) is de specificatie van de bytecode waar alle .NET-talen naartoe compileren. De CIL-code wordt door de Common Language Runtime (CLR) at-runtime omgezet naar machinecode en uitgevoerd. Omdat de CIL-code at-runtime wordt gecompileerd vlak voor deze wordt aangeroepen, spreekt men wel van JIT (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 als ISO-standaard.

Zie ook[bewerken]

Externe links[bewerken]