Wat zijn Implicit Operators in .net en waarom zou je ze gebruiken?

door Maikel van den Bosch

Inleiding

Bij programmeren is het vaak noodzakelijk om datatypes te converteren naar andere datatypes. Implicit operators vormen een eenvoudige en effectieve manier om deze conversies beschikbaar te maken. In deze blogpost wil ik uitleggen wat implicit operators zijn, hoe ze werken, en de technische voordelen ervan, waaronder optimalisaties door de Just-In-Time (JIT) compiler en verminderde overhead van methode-aanroepen.

Wat zijn implicit operators?

Implicit operators zijn speciale operatoren in talen zoals C# die automatisch een waarde van het ene type naar het andere type converteren zonder dat de programmeur een expliciete aanroep hoeft te doen. Bijvoorbeeld, als je een integer-waarde wilt omzetten naar een float-waarde, kan een implicit operator dit automatisch voor jou doen.

Hoe werken ze?

Stel, je hebt een class `ClassA` en je wilt deze class impliciet kunnen converteren naar een class `ClassB`. In C# zou je een implicit operator als volgt definiëren:

JIT-Compiler optimalisatie

Implicit operators profiteren van JIT-compilatie. De code wordt verbeterd door de Just-In-Time (JIT) compiler. Dit zorgt ervoor dat ze zo efficiënt mogelijk worden uitgevoerd. De JIT-compiler maakt gebruik van verschillende optimalisatietechnieken om de uitvoeringssnelheid te verhogen. Ik zou hier ook nog wel een heel verhaal over kunnen vertellen, maar dit valt buiten de scope van deze blogpost. Maar misschien ooit 😉

Vermindering van methode-overhead

Een bijkomend voordeel van implicit operators is dat ze de overhead van methode-aanroepen verminderen. Omdat de operator deel uitmaakt van de gecompileerde code, wordt de extra verwerkingstijd, die meestal nodig is voor het aanroepen van een methode, verminderd.

Leesbaarheid en onderhoudbaarheid

Implicit operators kunnen de leesbaarheid van de code verbeteren door het aantal expliciete conversies te verminderen. Echter, ze kunnen ook verwarrend zijn als de conversielogica complex is of als er onverwachte neveneffecten zijn. Het is daarom belangrijk om ze spaarzaam en zorgvuldig te gebruiken.
Stel je hebt een parent object met child objecten, dan kan het complex worden. Advies, zorg dat alle child objecten ook een implicit operator hebben.
Stel de implicit operator krijgt NULL als input, dan moet hij ook als output NULL geven. Vaak zie je dat men de implicit operator in dit geval een leeg object als output laat teruggeven, hierdoor creëer je onverwachte resultaten.

Testbaarheid

Implicit operators kunnen moeilijker te isoleren zijn voor unit-tests in vergelijking met gewone methoden. Als je de logica wilt testen, moet je je unit-testen aanpassen om om te gaan met deze logica.

Conclusie

Implicit operators bieden een eenvoudige en efficiënte manier om typeconversies in programmeertalen zoals C# te beheren. Ze hebben prestatievoordelen dankzij JIT-compiler optimalisaties en verminderde methode-overhead. Echter, ze vereisen ook zorgvuldige overweging op het gebied van leesbaarheid en testbaarheid.

Object-2-object is een uitstekende optie om in implicit operators op te zetten, hier lees je meer over in mijn blog over object-2-object.