Whidbey Julekalender 2004

Julekalender2004 Åbn låge 1 Åbn låge 2 Åbn låge 3 Åbn låge 4 Åbn låge 5 Åbn låge 6 Åbn låge 7 Åbn låge 8 Åbn låge 9 Åbn låge 10 Åbn låge 11 Åbn låge 12 Åbn låge 13 Åbn låge 14 Åbn låge 15 Åbn låge 16 Åbn låge 17 Åbn låge 18 Åbn låge 19 Åbn låge 20 Åbn låge 21 Åbn låge 22 Åbn låge 23 Åbn låge 24

Nullable typer 01-12-2004 00:01:00

Dagens tip handler om en af .NET 2.0's nye features, nullable værdityper. Med nullable bliver det muligt at repræsentere en udefineret værdi (null i C# og Nothing i VB) for værdityper som f.eks. integers, booleans og egne strukturer. Den nuværende version af .NET har ikke denne mulighed, og man er som udvikler nødt til at finde på en værdi der betyder 'ugyldig' eller 'udefineret' når man arbejder med værdityper. Denne problemstilling er specielt aktuel, når man arbejder med data hentet i en database, hvor en kolonne kan være defineret som int, men de enkelte felter kan indeholde NULL.

Eksempel

Nullable type kan benyttes både i VB og C#, og denne lille demo af de nullable værdityper er skrevet i VB. Inspireret af duften af nybagte klejner der i disse dage har indtaget Captators kontorer, har vi lavet en struktur kaldet Højtid, som i al sin enkelthed indeholder en dato og et navn på en højtid som for eksempel... Jul.

Public Structure Højtid
  Private _dato As System.DateTime 
  Public Property Dato() As System.DateTime
    Get
      Return _dato
    End Get
    Set(ByVal value As System.DateTime) 
      _dato = value 
    End Set 
  End Property

  Private _navn As String 
  Public Property Navn() As String 
    Get
      Return _navn 
    End Get
    Set(ByVal value As String) 
      _navn = value 
    End Set
  End Property

  Public Sub New(ByVal dato As System.DateTime, ByVal navn As String)
    Me.Dato = dato 
    Me.Navn = navn 
  End Sub
End Structure

I vores lille applikation ønsker vi at lave en metode, der kan returnere højtiden for en given dato. Men hvad skal metoden returnere, hvis nu der ikke findes en højtid for den givne dato? Tja, da Højtid jo er en struktur kan den ikke have en udefineret værdi (null/Nothing) - hvis man altså ikke har .NET 2.0. For ved at returnere en System.Nullable(Of Højtid) i stedet for blot en Højtid, kan man returnere en udefineret værdi.

  Public Function GetHøjtid(ByVal arr As Højtid(), ByVal dato As System.DateTime) As System.Nullable(Of Højtid)
    Dim nullableResult As System.Nullable(Of Højtid) = Nothing 
    Dim i As Integer = 0 

    While (Not nullableResult.HasValue AndAlso i < arr.Length) 
      If (arr(i).Dato = dato) Then 
        nullableResult = arr(i) 
      End If 
      i += 1 
    End While 

    Return nullableResult 
  End Function

Derefter er der kun tilbage at tjekke, om metoden returnerer en udefineret værdi og give brugeren en passende besked. Til dette har vi også en lille metode.

  Sub PrintValue(ByVal h As System.Nullable(Of Højtid), ByVal dato As System.DateTime) 
    If h.HasValue Then
      MsgBox("Datoen " + dato.ToShortDateString() + " er " + h.Value.Navn) 
    Else 
      MsgBox("Datoen " + dato.ToShortDateString() + " er ikke en højtid !") 
    End If 
  End Sub

Syntaks

Syntaksen for erklæring af en nullable værditype (her med integer) er følgende:

  int? i; 
  Dim i As System.Nullable(Of Integer)

Værditypen wrappes i en System.Nullable, som i sig selv også er en struktur. På System.Nullable strukturen findes metoden HasValue, som returnerer hvorvidt den aktuelle instans indeholder en værdi eller er udefineret. Man kan altså ikke skrive:

  if (i == null) 
  {
    // Do Something
  }
  If (i Is Nothing) Then 
    ' Do Something
  End If 

Men derimod:

  if (!i.HasValue) 
  { 
    // Do Something 
  }
  If (Not i.HasValue) Then 
    ' Do Something
  End If

Tildeling af værdier foregår helt som i .NET 1.1, bortset fra at man også kan tildele værdien null/Nothing (ikke overraskende, da det jo netop er hele ideen med at lave nullables :^))

  i = null;
  i = 3;
  i = Nothing
  i = 3

Og når man skal have værdien ud af en System.Nullable, foregår det med ved hjælp af property'en Value, som i ovenstående PrintValue-metode.

Afsluttende

Der er yderligere finesser ved denne nye feature i .NET 2.0, som du sikkert allerede selv kan se anvendelser for. Hvis du har lyst til at snuse til .NET 2.0 og Whidbey kan du gå til følgende url: http://lab.msdn.microsoft.com/vs2005/

Captators Julekalender fortsætter i morgen.