Csharp/Datatyper

(Omdirigert fra «Csharp/Kapittel4»)

Datatyper

rediger

Datatyper legger grunnstenen for programmene våre, en datatype definerer hva slags data vi jobber med Her har vi to typer: verdityper og referansetyper

  • Verdityper
 Disse kan også refereres til som primitiver.
  • Referansetyper
 Dette er i all hovedsak klasser og interfaces.

Man har også void, men dette er ikke en datatype, men betyr at det ikke skal være noen datatype.

Verdityper, vil si at verdien til variabelen ligger rett i variabelen, og en endring av den vil direkte endre verdien i variabelen. Referansetyper derimot, vil verdien inneholde en referanse til den egentlige verdien. Forskjellen vil man merke i funksjoner, man kan endre verdier på verdityper uten at det påvirker verdien utenfor funksjonen (med mindre nøkkelordene ref eller out blir brukt. (se parameter i funksjoner)

Heltall

rediger

av de mest grunnleggende verdityper har vi heltallene, disse kan være signerte, eller usignerte (signed eller unsigned) en signert datatype, kan inneholde negative tall, og vil være i all hovedsak de vi jobber med usignerte kan derimot ikke inneholde negative tall, men kan være dobbelt så store på grunn av dette, fordi ett bit blir frigjort.

  • bool
    • denne datatypen kan kun inneholde true, eller false, og brukes til sammenligninger og lignende.
  • char (16-bit)
    • char er definisjonen på én unicode bokstav, og inneholder et tall mellom 0 og 65536, og skrives med apostroff, f.eks. 'a'
  • byte, sbyte (8-bit) (unsigned byte, signed byte)
    • byte kan inneholde verdiene 0 til 255, og kan skrives i heksadesimaler som 0x00 til 0xFF
    • sbyte kan inneholde verdiene -128 til 127
  • short, ushort (16-bit)
    • short kan inneholde verdiene -32768 til 32767
    • ushort kan inneholde verdiene 0 til 65536 og kan skrives i heksadesimaler som 0x0000 til 0xFFFF
  • int, uint (32-bit)
    • int kan inneholde verdiene -2.147.483.648 til 2.147.483.647
    • uint kan inneholde verdiene 0 til 4.294.967.296 og kan skrives 0x00000000 til 0xFFFFFFFF
  • long, ulong (64-bit)
    • long kan inneholde verdiene -9.223.372.036.854.775.808 til 9.223.372.036.854.775.807
    • ulong kan inneholde verdiene 0 til 18.446.744.073.709.551.616 og kan skrives 0x0000000000000000 til 0xFFFFFFFFFFFFFFFF

For at man skal kunne tilegne heksadesimaler til signerte variabler, må man gjøre dette i en unsafe blokk

int i;
unsafe
{
  i = 0xF0000000;
}

Flyttall

rediger

deretter har vi flyttall, dette er det som man kaller "desimaltall" i dagligtale, og inneholder som regel et desimaltegn. som for eksempel 1,34

vi har bare 3 slike datatyper i C#

  • float(32-bit)
    • dette tallet har en cirka rekkevidde på ±1.5 × 10−45 to ±3.4 × 1038[1]
    • float kalles single i noen tilfeller
  • double(64-bit)
    • dette tallet har en cirka rekkevidde på ±5.0 × 10−324 to ±1.7 × 10308[2]
  • decimal(128-bit)
    • dette tallet har en cirka rekkevidde på ±1.0 × 10−28 til ±7.9 × 1028[3]

Referanse typer

rediger

Den vanligste referansetypen er string, denne inneholder tekst, og er i utgangspunktet et array av char. Strenger er immutable, det vil si at de skal ikke endres etter de er laget, man trenger ikke å tenke på det, siden for å endre en streng etter den er laget, krever endel kunnskap om C#. en tekststreng skrives i gåseøyne, for derimot å skrive gåseøyne, kan man skrive \" i tekststrengen. Her kommer også en av de viktigste datatypene i .NET inn: object. Denne klassen danner grunnlaget for alle andre datatyper i .NET, selv verditypene. Denne klassen har noen funksjoner, som du ser går igjen på alle andre objekter i .NET.

  • ToString()
Denne funksjonen lager en tekststreng som skal representere objektet, denne er virtual og kan derfor overskrives i andre klasser.
  • GetHashCode()
Denne funksjonen skal lage et tall som representerer verdien i objektet, se hash function
  • Equals()
Denne funksjonen sammenligner objektet med et annet.
  • Finalize()
Dette er en gjemt funksjon, og er destructoren til objektet.
  • GetType()
Denne funksjonen kan brukes til å finne ut alt om objektet, fra hvile egenskaper den har, til attributer.

Casting

rediger

Ofte må man bytte datatype på objekter i programmering, for eksempel få heltall fra flyttall. Dette gjøres med casting, og det finnes to måter å gjøre det på. For referanseobjekter, bruker man som regel operator as, for verdityper bruker man (datatype)

// Verditype, int til double
int a; double b;
a = 320;
b = (double)a;
// Referansetype, System.Windows.Forms.Form til System.Windows.Forms.Control
Form a = new Form();
Control b = a as Control;
// Man kan også bruke vanlig casting her
Form a = new Form();
Control b = (Control)a;

Merk at referansetyper ikke kan konverteres til verdityper uten videre, i all hovedsak tenker vi da på string til int. Konvertering av string til int, kan gjøres med to funksjoner: int.Parse og int.TryParse Forskjellen på disse to, er at hvis int.Parse feiler, vil den gi en exception, men int.TryParse vil gi tilbake false.

casting kan brukes i en lang setning, om hverandre, men ofte kan man trenge å lukke dem i parentes, for å få ønsket effekt.

Casting kan også bli gjort manuelt, ved å bruke en operator for å gjøre det.

 public class MyClass
 {
   protected int m_value;
   public int Value { get { return m_value; } set { m_value = value; } }
   public static explicit operator int (MyClass target)
   {
     return target.m_value;
   }
 }

Her kan man bruke enten explicit, eller implicit, forskjellen er om man må spesifikt caste (explicit) eller om compileren går utifra at man skal caste til for eksempel int. (implicit)

Eksempel

rediger

// Nå som vi har lært om de forskjellige datatypene, og hvordan vi caster dem, kan vi trikse litt med det.
// Dette programmet regner ut omkrets og areal av en sirkel, og tar ett argument: radius.
using System;
public static class Program
{
  // Vi tar med argumenter i dette programmet.
  public static int Main(string[] args)
  {
    float radius = 0;
    if(float.TryParse(args[0], out radius))
    {
      // Matteformelen for omkrets er 2πR og πR₂ for areal hvis jeg husker rett fra mine ungdomsskoledager.
      float omkrets = 2 * (float)Math.PI * radius;
      float areal = (float)Math.PI * radius * radius;
      Console.WriteLine("omkrets:" + omkrets.ToString("0.00"));
      Console.WriteLine("areal  :" + areal.ToString("0.00"));
      return 0;
    }
    else
    {
      Console.WriteLine("Ugyldig radius");
      return 1;
    }
  }
}

Referanser

rediger
  1. http://msdn2.microsoft.com/en-us/library/b1e65aza(VS.80).aspx
  2. http://msdn2.microsoft.com/en-us/library/678hzkk9(VS.80).aspx
  3. http://msdn2.microsoft.com/en-us/library/364x0z75(VS.80).aspx