.NET Features: question mark

Door Luuk1983 op donderdag 23 juni 2011 09:03 - Reacties (11)
Categorie: Programmeren, Views: 4.272

Als .NET-programmeur merk ik regelmatig dat andere programmeurs niet op de hoogte zijn van sommige handige en slimme features in het .NET framework die het programmeren een stuk makkelijker kunnen maken. Soms zijn deze features verstopt, of soms zijn ze pas nieuw, maar handig zijn ze altijd. Dit is deel 4 van een serie met kleine voorbeelden van features die je als .NET-programmeur (met name in C#) mogelijk nog niet kent. Deze keer: het vraagteken in C#.

Met het vraagteken kan je in C# een hoop dingen doen. Ik zal een aantal voorbeelden geven van toepassingen van het vraagteken.

Ten eerste kan je het vraagteken gebruiken om objecten die dat standaard niet zijn nullable te maken. Nullable houdt in dat er een null waarde toegekend kan worden. De toepassing hiervan is redelijk beperkt omdat objecten die afstammen van de Object class al nullable zijn, maar dingen zoals een int of bool zijn dat standaard niet.

C#:
1
2
3
4
//This doesn't work
int aNotNullableInt = null;
//This is OK
int? aNullableInt = null;


Je kan nu met .HasValue en .Value controleren of het object null is of niet en wat de waarde dan is.

C#:
1
2
3
4
5
6
7
8
9
object foo;
//The long version
if (aNullableInt.HasValue)
    foo = DoSomething(aNullableInt.Value);
else
    foo = DoSomething(-1);

//The short version that does the same thing
object foo = (aNullableInt.HasValue) ? DoSomething(aNullableInt.Value) : DoSomething(-1);


Als de conditie voor het vraagteken true is zal de code direct achter het vraagteken uitgevoerd worden. Als de conditie false is zal de code direct achter de dubbele punt uitgevoerd worden.

Al laatste is er een constructie met een dubbel vraagteken. Waar de constructie hierboven bedoeld is om middels een conditie optie A of B te laten uitvoeren, is de dubbele vraagteken constructie bedoeld om een alternatieve optie te geven in het geval dat een object null is:

C#:
1
2
3
4
5
6
7
8
9
//This is the long version
object newObject;
if (foo != null)
    newObject = foo;
else
    newObject = new object();

//This is the short version that does the same thing
object newObject = foo ?? new object();


In het geval dat 'foo' null is zal de waarde achter de ?? toegekend worden aan newObject.

Wederom hoop ik dat jullie er wat aan hebben. En wederom zijn suggesties altijd welkom.

Volgende: OV-chipkaart perikelen 08-'11 OV-chipkaart perikelen
Volgende: .NET Features: Object Initializer 06-'11 .NET Features: Object Initializer

Reacties


Door Tweakers user [ti], donderdag 23 juni 2011 09:14

zitnietopteletten

[Reactie gewijzigd op donderdag 23 juni 2011 09:15]


Door Tweakers user [ti], donderdag 23 juni 2011 09:15

waarisdedeleteknop

[Reactie gewijzigd op donderdag 23 juni 2011 09:15]



Door Tweakers user Korben, donderdag 23 juni 2011 09:51

Misschien waardevol om te vermelden dat net als bij de conditional operator (?:) de null-coalescing operator (??) de right-hand operand pas evalueert wanneer de left-hand null blijkt te zijn. Blijkt wel uit de code, maar toch... :)

[Reactie gewijzigd op donderdag 23 juni 2011 09:53]


Door Tweakers user edeboeck, donderdag 23 juni 2011 10:13

Lichtjes off-topic, maar voor de zware fans van de conditional/ternary operator: hij is rechts-associatief, dit betekent dat de expressie
C#:
1
a ? b : c ? d : e

geŽvalueerd wordt als
C#:
1
a ? b : (c ? d : e)

en niet als
C#:
1
(a ? b : c) ? d : e

Al vind ik nog steeds dat code vooral ook leesbaar moet zijn ;-)
Bron
edit:
Overbodige lijnen verwijderd en bronvermelding toegevoegd

[Reactie gewijzigd op donderdag 23 juni 2011 10:15]


Door Tweakers user theike, donderdag 23 juni 2011 10:48

En wederom bedankt :) Nooit bij stil gestaan dat de ? ook gebruikt kon worden voor initialisatie. Wel was ik op de hoogte van het gebruik voor return waardes.

[Reactie gewijzigd op donderdag 23 juni 2011 10:48]


Door Tweakers user FlowinG, donderdag 23 juni 2011 11:05

Let wel op met Nullable<T> types (value types met een vraagteken) omdat hier boxing plaatsvindt, wat negatief effect heeft op programmacode. Maw: gebruik het niet te pas en te onpas.

Door Tweakers user Luuk1983, donderdag 23 juni 2011 11:23

@FlowinG
Inderdaad, das is zeker waar. Waar ik het nogal eens tegenkom, is als je Linq2SQL gebruikt en je hebt een tabel in je database met een int waarde die NULL mag zijn, dan is de bijbehorende property ook een Nullable int.

Door Tweakers user RobIII, donderdag 23 juni 2011 12:01

maar dingen zoals een int of bool zijn dat standaard niet
Die "dingen" heten Value types ;) Met die "question mark" maak je er een nullable type van en dan heb je nog reference types.

Zo noem je de ?: ook wel de conditional operator (of ternary) en de ?? de null-coalescing operator.

Wel zo handig als je "dingen" bij hun naam noemt ;) Waarom is het handig om die "namen" van die operators te kennen? Omdat het makkelijker / beter googled dan "??" of "dubbel vraagteken" :P

Een compleet overzicht van operators is overigens hier te vinden.

edit:

En dan zal ik voortaan tabjes wat minder lang laten openstaan om dan niet met zaken aan te komen kakken die al lang gemeld zijn :P :X

[Reactie gewijzigd op donderdag 23 juni 2011 12:07]


Door Tweakers user TJHeuvel, donderdag 23 juni 2011 16:05

Ik zie eigenlijk het verband niet tussen alle dingen die je noemt, behalve dat ze toevallig allemaal een vraagteken als syntax gebruiken.

An sich zijn Tenary operators, de null-coalescing operator en nullable types natuurlijk handig, en als ik jou was zou ik er ook gewoon 3 posts van maken.

[Reactie gewijzigd op donderdag 23 juni 2011 16:05]


Door Tweakers user Luuk1983, donderdag 23 juni 2011 16:33

@CyCloneNL
Er is ook niet echt een verband, behalve dat ik op ťťn voorbeeld wilde doorgaan om de verschillende mogelijkheden van het vraagteken te laten zien (ondanks dat je dus verschillende dingen kan doen met het vraagteken).

Reactie formulier
(verplicht)
(verplicht, maar wordt niet getoond)
(optioneel)