System.Nullable og Int32?

Faldt over dette i dag. Det har åbenbart altid eksisteret i C#, så det er åbenlyst mig, der er langsom i optrækket.

Man kan sætte en value type (eller en struct) til null ved at sætte et ? efter typen, fx:

Int32? i = null; 

Dette er syntactic sugar for:

System.Nullable i = null;

Egentlig er det et super-simpelt trick. Hvis vi ser på noget IL for System.Nullable ser constructoren sådan ud (uden at jeg skal påstå at være IL-ekspert):

.method public hidebysig specialname rtspecialname
instance void .ctor(!T 'value') cil managed
{
// Code size 15 (0xf)
.maxstack 8
IL_0000: ldarg.0
IL_0001: ldarg.1
IL_0002: stfld !0 valuetype System.Nullable`1::'value'
IL_0007: ldarg.0
IL_0008: ldc.i4.1
IL_0009: stfld bool valuetype System.Nullable`1::hasValue
IL_000e: ret
} // end of method Nullable`1::.ctor

Dvs. System.Nullable<T> er blot en klasse, der enkapsulerer en struct i det interne private felt ‘value’. Selve klassen er en reference type og kan derfor sættes til null. Det er således ikke value typen, fx Int32, der sættes til null, men det enkapsulerende objekt af typen System.Nullable<T>, der jo per definitioni kan være null. Enkelt, men smart. Den er skrevet bag øret:-)

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s