Hoofdstuk 1 - Les 4
Implicit conversion is als de doel variabele de complete inhoud kan bevatten van de variabele waarvan gecast wordt:
Boxing converteert een value type naar een reference type en unboxing converteert een reference type naar een value type.
Boxing:
Deze code kan als volgt gebruikt worden:
int i = 20;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 = i;
double d = 100.50;Deze manier van converteren kan worden opgelost met behulp van de volgende manieren:
int i = d;
- System.Convert()
- type.ToString()
- type.Parse
- type.TryParse()
Boxing converteert een value type naar een reference type en unboxing converteert een reference type naar een value type.
Boxing:
int = 123;Unboxing:
object 0 = (object)i;
object o = 123;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:
i = (int)o;
- 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.
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
Een reactie posten