Operators
++ operator
b = a++
- Pakt de waarde van
a
- Verhoogt
a met 1
b = ++a
- Verhoog
a met 1
- Pakt de waarde van
a
int maxvalue
int i = int.MaxValue;
int result = i + 1;
i == int.MinValue // true
checked en unchecked
checked
{
int i = 10;
i++;
}
- Keyword
checked gooit een exception bij underflow en overflow
- Overflow treedt op bij
Maxvalue + 1 of MinValue - 1
- Underflow treedt op bij een getal zo dicht bij 0 dat deze als 0 wordt teruggegeven, maar niet had moeten zijn
- By-default wordt er niet gechecked en moet
checked expliciet toegevoegd worden
- Er kan aangezet worden dat er by-default gechecked wordt
- Keyword
Unchecked gebruiken om juist niet te checken
AND en ANDALSO
&& (AND) en & (ANDALSO)
&& Returnt al als de linker expressie false is. Er wordt dan uberhaupt niet naar de andere expressie gekeken
& Kijkt eerst bij beide expressies of ze true of false zijn en kijkt daarna of het geheel true is
Elvis
int i = something != null ? something.Value : 10;
Zet de .Value in i als something niet null is. Anders 10 als waarde
Null coalescence
b = something ?? new Bird();
Als something niet null is wordt deze in b gestopt. Anders een nieuwe instantie van Bird in b stoppen
Null conditional
Als something null is, wordt b null. Anders de .Value in b stoppen
Reken Operators
Double d; int h; a = d - h;
- Gaat op zoek naar een operator die precies past.
- Daarna een van de twee impliciet converteren naar de andere, zodat een operator met dezelfde types gebruikt kan worden
Bitwise
5 & 6 == 4
- 5 is 101 in bitwaardes, 6 is 110 in bitwaardes. Er wordt gekeken naar de posities waar er beide 1’s staan. Is dit waar, wordt deze positie een 1, anders een 0
5 | 6 == 7
- 5 is 101 in bitwaardes, 6 is 110 in bitwaardes. Er wordt gekeken naar de posities waar er in tenminste 1 van de 2 getallen een 1 staat. Is dit waar, wordt deze positie een 1, anders een 0
Overloading
implicit operator + (Time a, Time b) { ... }
implicit operator Time (double d) { ... }
explicit operator Time (double d) { ... }
- Kan, in tegenstelling tot impliciete operators, exceptions gooien
OO
- Encapsulatie
- Herbruikbaarheid
- Single responsibility
- Inheritance
Acces modifiers
Public
Te bereiken binnen en buiten de assembly
Protected Internal
Hetzelfde als internal, maar ook zichtbaar voor derived classes buiten de assembly
Internal
Te bereiken binnen de assembly
Protected
Te bereiken vanuit eigen en derived classes
Private
Te bereiken vanuit eigen class
- Let op: dit is class-private, niet instance-private
- Een instantie van class kan bij private members van een andere instantie van dezelfde class
Constants
Het const keyword bestaat niet daadwerkelijk in IL . De waarde wordt compile-time overal letterlijk in gezet.
- Kan alleen waardes bevatten die compile-time bekend zijn.
Composition over inheritance
Het is niet fijn om van concrete classes af te leiden
- Favour composition over inheritance
- Decorator pattern
Constructors
- Moet ervoor zorgen dat een object in een geldige toestand komt
- Static constructors worden uitgevoerd wanneer het stukje IL geladen wordt
Field vs Property
- Property maakt get en set methodes met een private variabele
- Geen enkel verschil verder
- Eigenlijk altijd een property gebruiken, zodat aanroepende partijen niet hoeven te hercompileren bij een wijziging
- Veel frameworks kunnen alleen overweg met properties
Default waardes
public double Weight { get; private set; } = 1.0;
public Animal() : this(1.0) {}
public Animal(double weight = 1.0) {}
public Animal() { Weight = 1.0 }