C-sharp

C# (engelska: C-sharp, försvenskning: C-kors) är ett objektorienterat programspråk utvecklat av Microsoft som en del av .NET-plattformen. Språket utveckling startades av Anders Hejlsberg som rekryterats från Borland där han skapat TurboPascal och varit chefsarkitekt för Delphi. Nuvarande chefsarkitekt för språket är Mads Torgersen. Officiellt är språket baserat på C++ , 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 plattformsoberoende 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. På senare tid har det utvecklats populära verktyg såsom Xamarin som innebär att kod skriven i C# och .NET i hög grad och ända upp 100 % kan användas för att skapa appar till både iOS, Android och Windows. Dessa program kostade, men sedan 2015 kan man med Visual Studio utveckla till flera plattformar gratis.

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

Historik 
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 
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 
 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 
 Marginellt långsammare programuppstart – Tillämpningar skrivna i C# körs liksom javaprogram i en virtuell maskin vilket bland annat 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.
 C# är ej lämpligt för realtidsapplikationer eftersom skräpsamlare används.
 Prestandan är lägre än optimerad C eller C++-kod.

Programkodsexempel 
Det klassiska "Hello, world!"-programmet i C#:
using System;

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

namespace HelloWorld
{
  class Hello
  {
    static 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 Program
   {
     public static void Main()
     {
       int ageOfKalle;
       int ageOfKajsa;
       Console.WriteLine("Hur gammal är Kalle?");
       ageOfKalle = int.Parse(Console.ReadLine());
       Console.WriteLine("Hur gammal är Kajsa?");
       ageOfKajsa = int.Parse(Console.ReadLine());
       if(ageOfKalle > ageOfKajsa)    //om Kalle är äldre än Kajsa
       {
          Console.WriteLine("Kalle är äldre än Kajsa");
       }
       else if(ageOfKalle < ageOfKajsa)    //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 fält 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 instantiera 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
            Car car = new Car { Model = "Volvo", RegistrationNumber = "ABC123", Owner = new Person { FirstName = "Fredrik", LastName = "Karlsson", Age = 19 } };
            //Metod två
            Car car2 = new Car();
            car2.Model = "Volvo";
            car2.RegistrationNumber = "ABC123";

            car2.Owner = new Person();
            car2.Owner.FirstName = "Fredrik";
            car2.Owner.LastName = "Karlsson";
            car2.Owner.Age = 19;

            Console.Write(car.ToString());
            Console.ReadKey();
        }
    }

    class Person
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public int Age { get; set; }

        public override string ToString()
        {
            return string.Format("{0} {1}, {2} år gammal.", FirstName, LastName, Age);
        }
    }

    class Car
    {
        public string RegistrationNumber { get; set; }
        public string Model { get; set; }
        public Person Owner { get; set; }

        public override string ToString()
        {
            return string.Format("En {0} med registreringsnummer {1}, ägs av {2}", Model, RegistrationNumber, Owner.ToString());
        }
    }
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!";
}

Referenser

Källor

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

Externa länkar 

 Microsoft Visual C#
 csharpskolan.se programmeringsartiklar och exempel på svenska

.NET programspråk
Objektorienterade programspråk
Klassbaserade programspråk
Microsoft