Når man er implicit

by Jesper marts 11, 2009 14:23

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

Tags:

Kommentarer

11-03-2009 17:50:33 #

Jakob Andersen

Dejligt eksempel på en ofte overset men desværre også nogengange misbrugt feature.

Må jeg spørge hvorfor du ikke laver Time som en struct, du kan også bruge implicit her uden problemer?

Jakob Andersen Denmark

12-03-2009 09:07:43 #

Jesper

Jacob> Jo - mit eks. her er oplagt kandidat til en struct - det var bare for at gøre eksemplet så simpelt som muligt.

Jesper Denmark

04-04-2009 11:17:23 #

Janus Knudsen

Har prøvet at skrive til dig igennem Kontakt her på siden, men den virker ikke Frown

Janus Knudsen Denmark

Kommentarerne er lukkede

Powered by BlogEngine.NET 1.5.0.7
Theme by Mads Kristensen | Modified by Mooglegiant

About

Mit navn er Jesper Jensen, og jeg arbejder til dagligt som web-udvikler hos DGI, hvor mit speciale er klientside applikationer. Før det var jeg nogle år i robotbranchen, hvor jeg arbejdede med 3D simulering og system koordinering. Jeg elsker webudvikling, og specielt JavaScript har min interesse. Jeg har blogget om mine oplevelser med udvikling siden 2004

Calendar

<<  september 2010  >>
mationtofr
303112345
6789101112
13141516171819
20212223242526
27282930123
45678910

View posts in large calendar

RecentComments

Comment RSS