Programski jezik C sharp

C#[a] je večparadigmatski programski jezik za splošno uporabo, ki obsega močno tipizacijo ter imperativno, deklarativno, funkcijsko, generično, komponentno orientirano in objektno orientirano programiranje z zmožnostjo refleksije. Upravljanje s pomnilnikom temelji na čistilniku spomina.[2][3][4]

C#
Paradigmaobjektno orientirana, strukturirana, imperativna, na podlagi dogodkov, generična, deklarativna, komponentno orientirana, asinhrona, funkcijska, generična, refleksivna, sočasna
Začetna izdaja2001
OblikovalMicrosoft, Anders Hejlsberg[d] in Mads Torgersen[d]
RazvijalecMicrosoft
Stabilna izdaja12.0[1]
Tipizacijastatična, dinamična, močna, varna, nominativna, delno sklepalna
Večje implementacijeVisual C#, ogrodje .NET, Mono, .NET Core, UWP
Dialekti, Spec#, Polyphonic C#, Enhanced C#
VpliviC, C++, Java, Delphi, Objektni Pascal, (LINQ), Eiffel, F# (async), Haskell, Icon, J#, J++, ML, Modula-3, Rust, VB
Vplival naBoo, Cobra, D, F#, Go, Groovy, JavaScript, Julia, Nim, Ruby, Swift, Kotlin, TypeScript
Običajna končnica datotekecs in csx
Spletna strancsharp.net
DružinaC
Wikibooks logo C Sharp Programming na Wikibooks

C# se pri skladnji zgleduje po številnih drugih programskih jezikih, najbolj izrazito po C/C++ in javi. Jezik je bil skrbno načrtovan z namenom biti čim bolj preprosti in moderni ter uporabiti najboljše značilnosti drugih jezikov in popraviti pomanjkljivosti, ki so se pokazale v njih. Pomemben primer so generični tipi, katerih specifikacija je v C# bolj dodelana kot v javi, kar omogoča bolje optimizirano strojno kodo, večjo varnost pri definiciji tipov (lažje odkrivanje nekonsistentnosti v času prevajanja) ter striktno upoštevanje kovariančnosti in kontravariančnosti.[5][6]

C# je programski jezik, ki cilja na izvajalsko okolje CLI in s tem ogrodje .NET ter njegove različice kot je Mono. Zaradi tega se programi v C# izvajajo v posebnem izvajalskem okolju in se programska koda v tem jeziku šteje za upravljano kodo. Dele programov napisane v C# je zato enostavno povezovati z deli, ki so napisani v kateremkoli drugem programskem jeziku skladnem s CLI, z obstojem prenosljivih implementacij CLI (npr. Mono ali .NET Core) pa imajo programi napisani v C# tudi zelo dobro prenosljivost med različnimi platformami. Zaradi točne specifikacije programskega jezika in vmesnega jezika CIL, se lahko program napisan v C# neposredno prevede in izvede na drugih okoljih, ne da bi bilo treba za prenosljivost program spreminjati. C# je tudi prva izbira za razvijanje iger v igralnem pogonu Unity. Zaradi omenjenih značilnosti, jasne in dodelane skladnje, velike izraznosti (možnost uporabe različnih paradigem) je C# eden najbolj priljubljenih programskih jezikov.[7][8]

Zgodovina

uredi

C# je razvilo podjetje Microsoft v okviru razvoja ogrodja .NET z Andersom Hejlsbergom na čelu, ki je pred tem bil glavni oblikovalec Delphi-ja in Turbo Pascal-a. Izdano je bilo okoli leta 2000 z namenom nadomestiti javo. Jezik sta kot mednarodni standard odobrili organizaciji Ecma (ECMA-334) in ISO (ISO/IEC 23270:2006).

Včasih so tudi imeli maskoto Andy-ja imenovan po glavnem oblikovalcu Andersu Hejlsbergu, vendar so ga upokojili leta 2004.[9]

Imenovanje

uredi

Med razvojem so za programski jezik uporabljali kratico "Cool" (C-like Object Oriented Language), vendar so jo opustili zaradi marketinških razlogov, ter uporabili ime od prejšnjega nedokončanega projekta iz leta 1988, ki je imelo ime C#.

C# je dobilo navdih za svojo ime preko notnega zapisa, kjer višaj označi, da naj se ton za en polton zviša, podobno kakor v C++-u, kjer "++" označi, da naj se spremenljivka zviša za eno vrednost. Višaj je tudi po zgledu podoben skupku štirih plusov, dvakrat več kot jih ima C++, kar še bolj označi, da je nadgradnja njega. Izgovorjava imena je v angleščini tudi enakoglasnica izraza "see sharp", kar pomeni imeti bister pogled.

Ker se višaj ne pojavi na večini tipkovnic so se odločili uporabiti lojtro za približek temu, kakor je pa tudi zapisano v C# specifikaciji ECMA-334.

Končnica je zaradi tega tudi bila uporabljena v drugih programskih jezikih kakor programski jezik F#.

Različice

uredi
Različica Specifikacija Datum .NET Visual Studio
ECMA ISO/IEC Microsoft
C# 1.0 December 2002 April 2003 Januar 2002 Januar 2002 .NET 1.0 Visual Studio .NET 2002
C# 1.1

C# 1.2

Oktober 2003 April 2003 .NET 1.1 Visual Studio .NET 2003
C# 2.0 Junij 2006 September 2006 September 2005[b] November 2005 .NET 2.0 Visual Studio 2005

Visual Studio 2008

C# 3.0 Brez[c] Avgust 2007 November 2007

.NET 2.0 (Razen LINQ/Query Extensions)[10]
.NET 3.0 (Razen LINQ/Query Extensions)[10]
.NET 3.5

Visual Studio 2008
C# 4.0 April 2010 April 2010 .NET 4 Visual Studio 2010
C# 5.0 December 2017 December 2018 Junij 2013 Avgust 2012 .NET 4.5 Visual Studio 2012
Visual Studio 2013
C# 6.0 Brez Brez Julij 2015 .NET 4.6

.NET Core 1.0

Visual Studio 2015
C# 7.0 Predlog Specifikacije Marec 2017 .NET 4.7

.NET 4.8

.NET Core 2.0

Visual Studio 2017
C# 8.0 Predlog Specifikacije September 2019 .NET Core 3.0 Visual Studio 2019
C# 9.0 Predlog Specifikacije September 2020 .NET 5.0 Visual Studio 2019
C# 10.0 Predlog Specifikacije November 2021 .NET 6.0 Visual Studio 2022

Skladnja

uredi

Glavna skladnja C#-a je zelo podobna skladnji C-ja, C++-a in Jave:

  • Konec stavka je označen s podpičjem ;.
  • Stavki so združeni skupaj v zavitih oklepajih { in }.
  • Spremenljivke dobijo vrednost preko enačaja =, zaradi tega je pa operator preverjanja enakosti dvojni enačaj ==.
  • Oglati oklepaji [] se uporabljajo pri tabelah v njihovi deklaraciji in za pridobitev vrednosti na določenem indeksu v njih.

Značilnosti

uredi

Podatkovni tipi

uredi

C# uporablja združeni sistem za tipizacijo, ki se imenuje Common Type System, kjer je določeno, da je vsak tip podrazred razreda System.Object. Ta sistem razdeli tipe na dve glavni vrsti:[4]

  1. Vrednostni tipi
  2. Referenčni tipi

Vrednostni tipi neposredno vsebujejo podatek in so ponavadi alocirani na skladu. V preverjanju enakosti se vrednostni tipi primerjajo po enakosti podatka.

Referenčni tipi shranjujejo referenco do podatka v pomnilniškem naslovu in so alocirani na kopici. V preverjanju enakosti se referenčni tipi primerjajo po enakosti pomnilniškega naslova (razen, če so operatorji preobteženi kot v primeru System.String).

Zgled:

static void Main()
{
    // Primer vrednostnih tipov:
    int srecna = 7;
    double zlatiRez = 1.61;
    char velikiC = 'C';
    bool jeRes = true;
    
    // Primer referenčnih tipov:
    string jezik = "C#";
    int[] tabCelih = new int[10];
    object mojObjekt = new object();
}

Generični tipi

uredi

Generični tipi so bili uvedeni v različici 2.0. Generični tipi uporabljajo tipske parametre, ki omogočajo načrtovanje razredov in metod, ki ne specifirajo natančno vseh uporabljenih tipov na ravni definicije, ampak se to zgodi šele pri instanciaciji razreda oziroma klicu metode, torej se lahko razred oziroma metoda pozneje uporabi kot kateregakoli tipa. Na nivoju generične definicije se na tip elementov sklicujemo s tipskim parametrom T.

Zgled:

// Deklaracija generičnega razreda določenega tipa, ki deluje kot
// seznam elementov določenega tipa (tip elementov v tem trenutku ni znan)
public class GeneričniList<T>
{
    void Vnos(T vnos) { /* ... */ }
}

class Program
{
    private class PrimerRazreda { }
    static void Main()
    {
        // Deklaracija seznama celih števil:
        GeneričniList<int> listCelih = new GeneričniList<int>();

        // Deklaracija seznama nizov:
        GeneričniList<string> listNizov  = new GeneričniList<string>();

        // Deklaracija seznama elementov tipa PrimerRazreda:
        GeneričniList<PrimerRazreda> listElementov = new GeneričniList<PrimerRazreda>();
    }
}

Boxing in Unboxing

uredi

Boxing je operacija, ki pretvori vrednostni objekt v ustrezni referenčni objekt. Pri C#-u se to lahko zgodi implicitno, brez potrebe varne pretvorbe.

Unboxing je pa operacija, ki pretvori referenčni objekt v ustrezni vrednostni objekt. V tem primeru se pa to zgodi eksplicitno, torej potrebujemo varno pretvorbo.

int vrednostni = 4;                    // vrednostni tip
object referenčni = vrednostni;        // implicitna pretvorba (boxing)
int noviVrednostni = (int)referenčni;  // eksplicitna pretvorba (unboxing)

Zgledi

uredi

Spodaj je program, ki na konzolo izpiše sporočilo »Pozdravljen, svet!«:

using System;

class Program
{
    static void Main()
    {
        Console.WriteLine("Pozdravljen, svet!");
    }
}

Naslednji program isto sporočilo izpiše v novem oknu:

using System.Windows.Forms;

class Program
{
    static void Main()
    {
        MessageBox.Show("Pozdravljen, svet!");
    }
}

Glej tudi

uredi

C# teme

Integrirana razvojna okolja

Opombe

uredi
  1. Po dogovoru se uporablja kot drugi znak imena jezika znak '#' - znak za število, ASCII vrednost 35 (desetiško oz. 23 šestnajstiško), Unicode U+0023 oziroma HTML #. Gre za drug znak kot tisti, s katerim se označuje višaj v glasbi (npr. nota C♯ oz. Cis) in ima vrednost U+266F oziroma HTML ♯.
  2. Microsoftova specifikacija C# 2.0 vsebuje le nove značilnosti raličice 2.0. Starejše značilnosti so vsebovane v specifikaciji 1.2 (zgoraj).
  3. Za C# 3.0 in 4.0 ne obstajajo specifikacije ECMA ali ISO/IEC.

Sklici

uredi
  1. Announcing C# 12
  2. Rasheed (2006).
  3. Uranič (2015).
  4. 4,0 4,1 Lokar; Uranič (2009).
  5. »C#: Yesterday, Today, and Tomorrow: An Interview with Anders Hejlsberg]« (v angleščini).
  6. »Generics in C#, Java, and C++« (v angleščini).
  7. O'Reilly (2006).
  8. »State of the Computer Book Market 2008, part 4 — The Languages« (v angleščini).
  9. »Andy Retires«. Dan Fernandezov Blog. (angleščina) Blogs.msdn.com. 29. januar 2004. Arhivirano iz prvotnega dne 19. januarja 2012. Pridobljeno 4. oktobra 2012.{{navedi splet}}: Vzdrževanje CS1: bot: neznano stanje prvotnega URL-ja (povezava)
  10. 10,0 10,1 »Using C# 3.0 from .NET 2.0« (v angleščini). Danielmoth.com. 13. maj 2007. Pridobljeno 4. oktobra 2012.