Kender du det:
Man skal instantierer en række objekter, og befinder sig i et marreridt af instantiering og tildeling af egenskabsværdier.
Det gør jeg…
Er du i tvivl om hvad jeg mener?
Tag f.eks. et simpelt objekt, som en tidsangivelse. Jeg bruger ikke DateTime, da jeg kun ønsker at arbejde med et tidspunkt. Det kan gøres således:
public class Time{
public int Hour;
public int Minutes;
public override string ToString()
{
return string.Format("{0}:{1:00}", Hour, Minutes);
}
}
En fin lille klasse, som jeg kan bruge rundt om i mit program, men hvordan instantierer man den?
var tidspunkt = new Time();
tidspunkt.Hour = 8;
tidspunkt.Minutes = 30;
Ja, så kan man jo lave en konstruktør, som tager to parametre:
var tidspunkt = new Time(8, 1);
Alt sammen meget fint, men koden kommunikerer ikke rigtigt værdien. Jeg kunne meget bedre tænke mig at gøre følgende:
Time tidspunkt = "8:01";
På den måde, kommunikerer koden meget bedre hvad det er for en værdi, og er dermed langt mindre åben for fejl. Kan det overhovedet lade sig gøre at initialicerer en klasse via en streng?
Jo det kan – via implicit nøgleordet, kan man erklære en implicit konvertering mellem typer, som ellers ikke er konverterbare:
public static implicit operator Time(string s)
{
var parts = s.Split(':');
if (parts.Length != 2)
throw new ArgumentException("Time skal angives på formen tt:mm");
return new Time(int.Parse(parts[0]), int.Parse(parts[1]));
}
På den måde angiver man formen der accepteres, og man kan nu bruge den simple initialicerings syntaks.
Det synes jeg er smart…
Code on.
Tilføjet 12/3 2009: Time som struct og med lidt flere operatorer – feel free to add..:
Se kode