Hoofdstuk 1 - Les 4

Implicit conversion is als de doel variabele de complete inhoud kan bevatten van de variabele waarvan gecast wordt:
int i = 20;
double d = i;
Dit wordt ook widening conversion genoemd. Als de doel variabele de inhoud van de variabele niet geheel kan bevatten wordt dit narrowing conversion genoemd:
double d = 100.50;
int i = d;
Deze manier van converteren kan worden opgelost met behulp van de volgende manieren:
  • System.Convert()
  • type.ToString()
  • type.Parse
  • type.TryParse()
Boxing en unboxing
Boxing converteert een value type naar een reference type en unboxing converteert een reference type naar een value type.

Boxing:
int = 123;
object 0 = (object)i;
Unboxing:
object o = 123;
i = (int)o;
Boxing en unboxing zorgen voor overhead dus probeer het te vermijden. Boxing treedt ook op wanneer virtual methods worden aangeroepen van value types, zoals ToString(). Tips om boxing te voorkomen:

  • Implementeer type specifieke versies (overloads) voor een method die meerdere verschillende value types accepteert. Het is beter om verschillende overloaded methods te maken dan een methode die object parameter heeft.
  • Gebruik generics als dat mogelijk is in plaats van het doorgeven van een object parameter
  • Override de ToString, Equals en GetHash virtual members als je structures definieert.
Voor een structure kunnen conversion operators worden gedefinieert. Voorbeeld:


struct TypeA
{
public int value;

// Sta implicit conversie van een int toe
public static implicit operator TypeA(int arg)
{
TypeA res = new TypeA();
res.Value = arg;
return res;
}

// Sta explicit conversie van een int toe
public static explicit operator TypeA(TypeA arg)
{
return arg.Value;
}

// Voorkom boxing
public override string ToString()
{
return this.Value.ToString();
}
}


Deze code kan als volgt gebruikt worden:
TypeA a;
int i;

// Widening conversion
a = 42;

// Narrowing conversion
i = (int)a; // beter dan i = a.value;

Reacties

Populaire posts van deze blog

[SQL Server] varchar vs nvarchar

MS Sql 70-461: Chapter 5

[C#] Class serialiseren en deserialiseren