C-sharp

Från Wikipedia
Hoppa till: navigering, sök

C# (C-sharp) är ett objektorienterat programspråk utvecklat av Microsoft som en del av .NET-plattformen. Språkets utveckling leds av Anders Hejlsberg som rekryterats från Borland där han skapat TurboPascal och varit chefsarkitekt för Delphi. Officiellt är språket baserat på C++[1] , men det liknar till stor del Java.

Programkod skriven i C# omvandlas av en kompilator till så kallad CIL-kod (tidigare kallad MSIL-kod), vilket är en sorts bytekod vilken sedan körs i en virtuell maskin, CLR (Common Language Runtime). Detta liknar hur Java fungerar, där programkoden också omvandlas till bytekod som körs i en virtuell maskin. Språkens bytekoder är emellertid inte kompatibla.

C# är platformsoberoende som programmeringsspråk, även om Microsofts utvecklingsverktyg bara finns för Windows. Det finns åtminstone två olika fria implementationer av C#-kompilatorer, inom Mono och DotGNU-projekten. Dessa implementationer är dock ofullständiga och saknar vissa komponenter i .NET-ramverket, så i praktiken kan program som utvecklas i C# och .NET bli låsta till Windows.

Designmål[redigera | redigera wikitext]

  • C# ska vara enkelt, modernt och objektorienterat.
  • Robusthet, beständighet och produktivitet är viktigt. Språket borde ha hög typsäkerhet, stoppa försök till att använda oinitierade variabler och automatisk skräpinsamling

Historik[redigera | redigera wikitext]

Anders Hejlsberg rekryterades 1996 till Microsoft som arkitekt för Visual J++. Hejlsberg blev sedan chefsarkitekt för C#. C# utvecklades för att Microsoft vill ha ett språk som liknade Java, men som man själv ägde och som var inriktat mot Microsoft Windows, till skillnad från Java som är mer plattformsoberoende.

Version 1.2 av C# lämnades in till ECMA för standardisering och blev 2001 godkänt som ECMA-334. C# är även ISO-standardiserat som ISO/IEC 23270. Version 2.0 av C# släpptes i samband med version 2005 av Microsoft Visual Studio i november 2005. Version 3.0 släpptes i samband med .NET Framework 3.5 i november 2007.

Funktioner[redigera | redigera wikitext]

C# är det språk som är mest bundet till det underliggande Common Language Infrastructure (CLI). De flesta av de grundläggande datatyperna i C# motsvaras av värdetyper som stöds av de olika implementationerna av CLI. Specifikationen för C# tar dock aldrig upp några krav på kodgenerering: den säger inte att C# måste stödja en implementation av CLI, eller generera Common Intermediate Language-kod (eller CIL). En C#-kompilator skulle lika väl kunna generera vanlig maskinkod, som till exempel C- och FORTRAN-kompilatorer gör. Men i praktiken genererar alla existerande implementationer CIL.

C# skiljer sig ifrån C och C++ på många sätt:

  • Det finns inga globala variabler eller funktioner. Det är dock möjligt att deklarera statiska variabler och funktioner/metoder inuti publika klasser för att uppnå samma resultat.
  • Typen bool (alias för System.Boolean), som kan användas i villkorssatser (if, while etc.) är en separat typ. I C och C++ är den ett alias (typedef) för int (heltal). Typen int kan därför inte konverteras till en bool.
  • Minnesadresser kan refereras med pekare om de omsluts av ett kodblock (till exempel en metod) som är märkt med nyckelordet unsafe. Pekare kan referera till värdetyper, vektorer och andra pekare. Annars är pekare inte tillgängliga eftersom de inte anses vara säkra. Klassen System.IntPtr är en wrapper runt en pekare som är tillåten inom säker kontext. De kan dock bara manipuleras.
  • Hanterat minne kan inte frias av programmeraren, däremot kan det samlas in av skräpinsamlaren. Man kan också bestämma ett objekts livslängd med en using-sats.
  • C# är mer typsäkert än C och C++.
  • Enumerations-medlemmar placeras i sitt eget namnutrymme.
  • C# har egenskaper.
  • Reflektion av typer stöds fullt ut.
  • C# har för närvarande (i C# 3.0) 77 reserverade ord.

Fördelar[redigera | redigera wikitext]

  • Relativt lätt att lära sig – C#:s syntax liknar syntaxen i språk som C, C++ och Java. .NET innehåller ett stort kodbibliotek vilket förenklar vid utformning av komplexa system.
  • Flera användningsområden – C# kan både användas som kompilerat språk på en lokal dator och som språk i ASP.NET. Detta gör det enkelt att länka samman program på en klientdator med serverdatorers program.
  • Erbjuder enkel integration med andra Microsoft-baserade programvaror (OBS! Se även avsnittet Nackdelar för mer information om detta).
  • C#-kompilatorn kan användas utan licenser och speciella utvecklingsverktyg.

Nackdelar[redigera | redigera wikitext]

  • Marginellt långsammare programkörning – Tillämpningar skrivna i C# körs liksom javaprogram i en virtuell maskin vilket bl a innebär att programmet kompileras precis innan det körs (se JIT-kompilering) vilket leder till en fördröjd uppstartsfas. Detta kan dock avhjälpas med verktyget ngen.exe som ingår i programsviten vilket förkompilerar CIL-koden till maskinkod för aktuell processorarkitektur.

Programkodsexempel[redigera | redigera wikitext]

Det klassiska "Hello, world!"-programmet i C#:

using System;
 
namespace HelloWorld
{
  class Hello
  {
    public static void Main()
    {
      Console.WriteLine("Hello World!");
    }
  }
}
using System;
 
namespace HelloWorld
{
  class Hello
  {
    string hello = "Hello World!";
 
    public static void Main()
    {
      Console.WriteLine(hello);
    }
  }
}

Båda Programmen matar ut textsträngen "Hello World!".

If-sats i C#:

using System;
 
namespace If
{
  class If
   {
     public static void Main()
     {
       int KallesÅlder;
       int KajsasÅlder;
       Console.WriteLine("Hur gammal är Kalle?");
       KallesÅlder = int.Parse(Console.ReadLine());
       Console.WriteLine("Hur gammal är Kajsa?");
       KajsasÅlder = int.Parse(Console.ReadLine());
       if(KallesÅlder > KajsasÅlder)    //om Kalle är äldre än Kajsa
       {
          Console.WriteLine("Kalle är äldre än Kajsa");
       }
       else if(KallesÅlder < KajsasÅlder)    //om kalle är yngre än Kajsa
       {
          Console.WriteLine("Kalle är yngre än Kajsa");
       }
       else   //Inträffar om ingen av de ovanstående if-satserna inträffat
       {
          Console.WriteLine("Kalle är lika gammal som Kajsa");
       }
     }
   } 
}

Programmet frågar hur gamla Kajsa och Kalle är, sedan matar det ut en textsträng beroende på deras ålder.

Objekt i C#:

using System;
 
namespace CustomObject
{
  // Vår egen klass
  class Car
  {
    // Några variablar som tillhör klassen
    public string model;
    public int year;
 
    // Detta händer då ett nytt Car-objekt skapas
    public Car()
    {
      this.model = "";
      this.year = 0;
    }
  }
 
  class Main
  {
    public static void Main()
    {
      // Skapa ett nytt Car-objekt
      Car volvo = new Car();
      volvo.model = "Volvo Amazon";
      volvo.year = 1956;
 
      // Skriv ut bilmodellen
      Console.WriteLine("Modell: " + volvo.model);
      Console.WriteLine("År: " + volvo.year);
    }
  }
}

Det finns olika sätt att instansiera ett objekt av en klass på, ett exempel vore att använda Bil bil = new Bil(); eller som här nedan beskriver, det nedan vore precis som att använda sig av en konstruktor istället. Istället har man valt att låta klassen vara möjlig att konstruera utan en konstruktor och istället använder man metodiken nedan.

Ett lite mer komplicerat exempel av objektorientering i C# är följande:

class Program
    {
        static void Main(string[] args)
        {
            //Metod ett
            Bil bil = new Bil { BilModell = "Volvo", Registreringsnummer = "ABC 123", Ägare = new Person { Namn = "Fredrik", Efternamn = "Hoffmann", Ålder = 19 } };
            //Metod två
            Bil bil2 = new Bil();
            bil2.BilModell = "Volvo";
            bil2.Registreringsnummer = "ABC 123";
 
            bil2.Ägare = new Person();
            bil2.Ägare.Namn = "Fredrik";
            bil2.Ägare.Efternamn = "Hoffmann";
            bil2.Ägare.Ålder = 19;
 
            Console.Write(bil.ToString());
            Console.ReadKey();
        }
    }
 
    class Person
    {
        public string Namn { get; set; }
        public string Efternamn { get; set; }
        public sbyte Ålder { get; set; }
 
        public string Presentera()
        {
            return string.Format("{0} {1}, {2} år gammal.", this.Namn, this.Efternamn, this.Ålder);
        }
    }
 
    class Bil
    {
        public string Registreringsnummer { get; set; }
        public string BilModell { get; set; }
        public Person Ägare { get; set; }
 
        public override string ToString()
        {
            return string.Format("En {0} med registreringsnummer {1}, ägs av {2}", this.BilModell, this.Registreringsnummer, this.Ägare.Presentera());
        }
    }

Programmet använder ett egengjort objekt för att enkelt lagra information om bilar.

Ovanstående exempel är alla program för kommandotolken.

C# kan även användas för att göra bland annat grafiska program i Windows, systemtjänster och DLL-filer.

I ett grafiskt program finns inte möjligheten att använda sig av Console.WriteLine("text här"); utan information måste ges till användaren på annat sätt, exempelvis genom en textBox, richTextBox eller en label vilket skulle kunna se ut såhär:

//Följande exempel byter ut texten i label1 till "Hello World!"
if(checkbox1.Checked)
{
    label1.Text = "Hello World!";
}

Källor[redigera | redigera wikitext]

  1. ^ Osborn, John (2000-08-01), Deep Inside C#: An Interview with Microsoft Chief Architect Anders Hejlsberg, O'Reilly Media, http://windowsdevcenter.com/pub/a/oreilly/windows/news/hejlsberg_0800.html, läst 2010-03-21 

Referenser[redigera | redigera wikitext]

Den här artikeln är helt eller delvis baserad på material från engelskspråkiga Wikipedia

Litteratur[redigera | redigera wikitext]

  • Albahari, J och Albahari, B C# 5.0 in a Nutshell. The Definitive Reference, 0'Reilly, 2012

Externa länkar[redigera | redigera wikitext]