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
SyntaksSyntaksen 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)
{
}
If (i Is Nothing) Then
End If
Men derimod:
if (!i.HasValue)
{
}
If (Not i.HasValue) Then
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.
|