C sharp

Uit Wikipedia, de vrije encyclopedie
Ga naar: navigatie, zoeken
C#
Bestandsextensies .cs
Paradigma Objectgeoriënteerd
Verschenen in 2001
Huidige versie 4.0 (april 2010)
Typesysteem statisch, sterk
Implementaties .NET Framework, Mono,
Beïnvloed door C++, Java, Eiffel, Modula-3
Invloed op D, Java, Vala, Windows PowerShell
Website http://msdn.microsoft.com/nl-nl/vcsharp/
Portaal  Portaalicoon   Informatica

De naam is afgeleid van C#, de Engelse naam voor de Cis, dwz. de met een halve noot verhoogde C.

C# (Engels uitgesproken als "C sharp") is een object-georiënteerde programmeertaal ontwikkeld door Microsoft als deel van het .Net initiatief, en later geaccepteerd als standaard door ECMA (ECMA-334) en ISO (ISO/IEC 23270). Anders Hejlsberg was en is een van de belangrijkste voortrekkers betreffende de ontwikkeling en definitie van de taal. C# heeft een objectgeoriënteerde, procedurele syntaxis, gebaseerd op die van C++, met elementen van diverse andere programmeertalen (voornamelijk Delphi en Java).

De taal C# is samen met het .NET framework geïntroduceerd, en wordt beschouwd als een van de belangrijkste talen voor het platform.

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

Inhoud

[bewerken] Versies

Er zijn vier versies van de taal:

Versie Taal specificatie Microsoft compiler
C# 1.0 December 2001 January 2002
C# 2.0 December 2002 November 2005
C# 3.0 June 2005 November 2006
C# 4.0 June 2006 April 2010

[bewerken] Voorbeeld

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

[bewerken] Vergelijking met Java en C++

  1. 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.
  2. 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.
  3. 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.
  4. 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.
  5. base en override: base is zoals bij Java super en override is zoals bij Java en C++ virtual.
  6. Preprocessor directives: Java kent deze helemaal niet, C# alleen #define, dat een variabele van een constante waarde kan voorzien, 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 gecompileerde libraries in plaats van naar broncode.
  7. operators: hier bestaan extra operators t.o.v. C++, zoals de is, as, ?? en typeof, een subset hiervan bestaat ook in Java. C# ondersteunt net als C++ operator overloading; Java niet.
  8. Main: wordt gebruikt om het entry point voor een programma aan te geven, zoals in Java.
  9. 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 (dwz. geheugenadressen) door te geven.
  10. 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.
  11. foreach, in: laat toe om door 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.
  12. 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 gefaket met de preprocessor, in C++ bestaat dit echter wel in de vorm van 'using namespace'.
  13. 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.
  14. Machinecode vs. 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 voorzieningen zoals 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.

[bewerken] CIL (heette voorheen MSIL)

CIL ('Common Intermediate Language') heette voorheen MSIL ('Microsoft Intermediate Language'), maar is van naam veranderd om in aanmerking te komen voor de ISO standaard. CIL is de specificatie van de bytecode waar alle .NET-talen naartoe compileren. De CIL-code wordt door de CLR ('Common Language Runtime') at-runtime omgezet naar machine-code 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.

[bewerken] Externe links


Persoonlijke instellingen
Naamruimten
Varianten
Handelingen
Navigatie
Informatie
Hulpmiddelen
Afdrukken/exporteren
In andere talen