C sharp

Tämä artikkeli kertoo ohjelmointikielestä. C♯ on anglosaksinen musiikkimerkintä korotetulle C-sävelelle, jonka nimi on suomalaisittain ”cis”.
Teknisten rajoitusten vuoksi artikkelin yllä näkyvä otsikko on virheellisessä muodossa. Oikea kirjoitustapa on: C#.
C#
Paradigma olio-ohjelmointi
Tyypitys vahva, staattinen
Yleinen suoritusmalli tulkattava
Muistinhallinta automaattinen
Julkaistu 2000
Kehittäjä Microsoft
Merkittävimmät toteutukset .NET, Mono
Vaikutteet C++, Smalltalk, Java
Infobox OK

C# (lausutaan engl. see sharp) on Microsoftin .NET-alustalle kehitetty ohjelmointikieli. C# julkaistiin kesäkuussa vuonna 2000 ja kehitettiin yhdistämään C++:n tehokkuus ja Visual Basicin tuottavuus.[1]

C# on vahvasti tyypitetty, eli muuttujille tulee määritellä jokin tietotyyppi, kuten kokonaisluku, luokka tai merkkijono. Kielessä ja kääntäjässä on myös useita ohjelmointivirheitä vähentäviä toimintoja, esimerkiksi alustamattomien muuttujien käytöstä varoitetaan.

Historia

C#:n kehittäjinä mainitaan Anders Hejlsberg, Scott Wiltamuth ja Peter Golde.[1] Hejlsberg tuli Microsoft-yhtiön palvelukseen Borlandilta. Anders Hejlsberg oli ennen C#:a mukana Turbo Pascalin, Delphin ja J++:n kehitystyössä.

C#:n kehityksen päätavoitteena oli luoda useanlaisiin ympäristöihin soveltuva helppokäyttöinen, oliopohjainen ohjelmointikieli, jonka kansainvälistäminen olisi myös helppoa. C#:n tavoitteena oli lisäksi yhdistää:[2][3][4]

  • C:n syntaksi
  • Delphin tai C++:n tehokkuus
  • Javan (vaikkakin korostettu, että C# ei ole Java-klooni[5]), Visual Basicin tai Delphin tarjoama helppokäyttöisyys.
  • Javan ja jo 70-luvun alussa käytetyn UCSD p-Systemin (Pascal) välikoodin käyttö.

Toteutus

Microsoft on pyrkinyt saamaan C#:lle virallisen standardisoinnin. ISO-standardi ISO/IEC 23270:2003 on julkaistu vuonna 2003[6]. Standardin pohjalta ollaan tekemässä itsenäisiä toteuksia kielestä, esimerkiksi:

Rakenne

C# on korkeamman tasoinen, olioperusteinen, vahvasti tyypitetty kieli. Vahva tyypitys tarkoittaa, että muuttujilla on oltava aina jokin tietotyyppi, esimerkiksi kokonaisluku, luokka tai merkkijono. (C# kuitenkin mahdollistaa var-sanan käytön, kun tyyppi on niin lukijalle kuin kääntäjällekin selvä.) Korkea abstraktiotaso ilmenee erityisesti siinä, että muistinhallinta on automatisoitu eli automaattinen roskienkeräys vapauttaa muistia käyttöön sitä mukaa, kun objekti ei ole enää ohjelman saavutettavissa.[7]

C# muodostuu nimiavaruuksista (namespace), näissä olevista tyypeistä (esim. class) ja näissä määritellyistä jäsenistä, kuten datasta, funktioista, perustyypistä, rajapinnoista ja operaattoritoteutuksista. Tyyppien avulla luodaan (new) muuttujia, jotka sisältävät referenssin yhteen (arvotyyppi) tai useampaan (referenssityyppi) objektiin.[7]

C#-tyyppijärjestelmä on yhtenäinen ja sen avulla voidaan määritellä

  • yksinkertaiset arvotyypit (esim. int), jotka sisältävät numeron, merkin tai totuusarvon
  • null-arvotyypit (esim. int?) jotka sisältävät jonkin arvotyypin lisäksi null-arvon
  • enum-arvotyypit (enum E {...}), jotka sisältävät joukon vakioarvoja
  • tuple-arvotyypit ((T1, T2, ...)), jotka sisältävät yksinkertaisen joukon arvotyyppejä
  • struct-arvotyypit (struct E {...}), jotka sisältävät monimutkaisemman joukon arvotyyppejä
  • taulukkotyypit (esim. int[][])
  • luokkatyypit (class C {...}, string), jotka sisältävät dataa ja funktioita
  • rajapintatyypit (interface I {...})
  • delegaattityypit (delegate int D(...)), jotka sisältävät referenssin tiettyyn itsenäisesti käytettävään funktioon
  • record-tyypit (record struct tai record class), jotka sisältävät arvojen lisäksi tiettyjä synteettisiä jäseniä.[7]

Tyypin jäseniä voivat olla

  • kentät eli tyypin sisäiset muuttujat
  • vakiot eli muuttujat, joiden arvo vakioidaan käännöksen aikana
  • ominaisuudet, joka lukevat ja kirjoittavat arvoja
  • metodit, jotka määrittelevät luokan toiminnot
  • alustaja, joka luo tyypistä uuden objektin
  • indeksoija, joka lukee ja kirjoittaa indeksiarvoja
  • tapahtumat, joka ovat kenttiä, joiden muutoksiin käyttäjä reagoi tapahtumankäsittelijöillä
  • operaattorit, jotka määrittelevät matemaattisten operaattoreiden (esim. == tai +) toiminnan ja
  • finalisoija, joka vapauttaa resursseja roskienkeräyksen yhteydessä (määritellään harvoin).[7]

Luokka- ja rajapintatyyppejä organisoidaan perimähierarkioiksi niin, että kaikkien luokkien käyttämät jäsenet (data ja funktiot) löytyvät hierarkian abstrakteimmasta luokasta ja uudet luokat lisäävät yhä spesifisempiä jäseniä tarpeen mukaan. Tällöin luokkatyyppi määritellään tyylillä class AliTyyppi : Perustyyppi {...} tai interface Alityyppi : PerustyyppiI, PerustyyppiII {...}.[7]

Kaikkia ylätyypin jäseniä ei kuitenkaan ole pakollista periä sellaisenaan (polyformia). Jos esim. ylätyypin metodi on määritelty avainsanalla virtual, alatyyppi voi määritellä metodin uudelleen override-avainsanalla. Alatyyppi voi myös piilottaa ylätyypin jäsenen käyttämällä new-avainsanaa tai keskeyttää virtuaalisen jäsenen periytymisen sealed-avainsanalla.[7]

Luokka-, tietue-, rajapinta- ja delegaattityypit hyväksyvät myös parametreja, mikä mahdollistaa geneeristen tyyppien luomisen. Tällöin esim. luokkatyyppi määritellään tyylillä class Nimi<Tyyppi, Tyyppi> {...}.[7]

Tyyppien jäsenien näkyvyyttä ja muutettavuutta ohjelmissa säädellään avainsanoilla kuten public, private, protected, static, readonly, const, override, abstract, virtual ja sealed.[7]

Lausekkeisiin kuuluvat muun muassa

  • valintalausekkeet if ja switch
  • toistolausekkeet for, while, do ja foreach
  • siirtolausekkeet break, continue, goto, throw, return ja yield
  • poikkeuksien hallinnan try, catch ja finally
  • alustamisen new
  • rinnakkaislaskennan async ja await sekä
  • parametrimääreet ref, out, in ja params.[7]

Mainittavia operaattoreita ovat esim. ??-operaattori, joka palauttaa jälkimmäisen lausekkeen arvon edellisen ollessa null, ja ns. Elvis-operaattori ehto ? seuraus : vaihtoehto.[7]

C# tukee suoraan myös funktionaalisia tekniikoita, vaikka nämäkin perustuvat tyyppeihin. Delegaattityypit mahdollistavat itsenäiset funktiot. Hahmonsovitus onnistuu käyttämällä is ja switch lausekkeita. Alaviiva-muuttuja ja objekti-dekonstruktio mahdollistavat joustavan sijoittamisen funktioista uusiin muuttujiin. Lambda-lausekkeet ovat kielessä muotoa esim. (double x) => x * 2.0. Ennen kaikkea LINQ lisää kieleen hyvin deklaratiivisen menetelmän poimia tietoa datarakenteista lausekkeiden kuten from..in, where, orderby, group..by..into, join..in..on..equals, select..into ja let avulla. (LINQ toimii siis kuin SQL tietokannoissa.)[7]

Lisäksi kieleen kuuluvat attribuutit, jotka ovat tapa liittää tyyppeihin metadataa. Nämä merkitään ennen haluttua tyyppiä esim. [Author("E. Sukunimi")].[7]

Lähdetiedostot (.cs) käännetään yhdeksi ns. assembly-tiedostoksi (.dll tai .exe), joka sisältää välimuotoista koodia ja metadataa, mikä taas käännetään tarvittaessa prosessorille sopivalle konekielelle. C#-ohjelma aloittaa ajon ylimmän tason lausekkeesta tai Main-metodista.[7]

Esimerkki

Hello World -ohjelma.

// Lähdetiedosto esim. "HelloWorld.cs"
using System;

namespace HelloWorld
{
    class Program
    {
        static void Main()
        {
            Console.WriteLine("Hello world!");
        }
    }
}

Katso myös

Lähteet

  1. a b Veli-Matti Sivonen: Ohjelmointikielten periaatteet: C# -kieli 4.4.2004. Helsingin yliopisto. Viitattu 22.6.2018.
  2. http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-334.pdf
  3. http://news.cnet.com/2008-1082-817522.html
  4. http://news.cnet.com/2010-1071-831385.html
  5. http://windowsdevcenter.com/pub/a/oreilly/windows/news/hejlsberg_0800.html
  6. ISO/IEC 23270:2003 ISO. Viitattu 8.2.2017.
  7. a b c d e f g h i j k l m C# documentation docs.microsoft.com. Microsoft. Arkistoitu 13.8.2022. Viitattu 16.8.2022. (englanniksi)

Kirjallisuutta

  • Archer, Tom: Inside C#. Suomentanut Jussi Arola. Helsinki: Edita, 2001. ISBN 951-826-455-4.
  • Moghadampour, Ghodrat: C# -ohjelmointi. Jyväskylä: Sanoma Pro, 2012. ISBN 9789526306582.

Aiheesta muualla

Commons
Commons
Wikimedia Commonsissa on kuvia tai muita tiedostoja aiheesta C sharp.
  • n
  • k
  • m
Tuotantokäytössä
Akateemiset
Historialliset
Arkkitehtuuri:
  • Common Language Infrastructure
  • .NET assembly
  • .NET metadata
  • Base Class Library
Yhteisen kielen perusrakenne:
  • Common Language Runtime
  • Common Type System
  • Common Intermediate Language
  • Virtual Execution System
Kielet:
Windows Foundations:
Aiheeseen liittyviä:
  • Windows Forms
  • ASP.NET
  • ADO.NET
  • .NET Remoting
  • XAML
Muita toteutuksia:
  • .NET Compact Framework
  • .NET Micro Framework
  • Shared Source CLI
  • Portable.NET
  • Mono
Kehitysympäristöjä:
  • n
  • k
  • m
Tuotteet
Laitteisto
  • Kinect
  • HoloLens
  • LifeCam
  • Surface
    • Hub
    • Go
    • Laptop
    • Laptop Go
    • Pro
    • Studio
    • Duo
    • Neo
  • Xbox
Ohjelmisto
Ohjelmointikielet
Web-ominaisuudet
Yritys
Tapahtumat
  • Build
  • Ignite
  • Inspire
  • MIX
  • PDC
  • WinHEC
Osastot
Henkilöt
Oikeustapaukset
Tämä tietotekniikkaan liittyvä artikkeli on tynkä. Voit auttaa Wikipediaa laajentamalla artikkelia.