Verwirrung in VB.NET: ByRef und ByVal
.NET unterscheidet zwischen Referenz-Typen und Wert-Typen. Was bei vielen Entwicklern, die das nicht wissen oder beachten, zu kleineren Verwirrungen führen kann.
Aber zuerst einmal die Definition:
Werte-Typen sind zum Beispiel System.Int32 und System.Boolean welche im .NET-Framework vordefiniert sind. Eigene Structs und Enums sind ebenfalls Wertetypen. Strukturen sind auch dann Werte-Typen, wenn sie selber Referenz-Typen beinhalten.
Referenz-Typen sind Objekte mit Klassen oder Interfaces deklariert werden.
Wichtig: Referenz-Typen halten immer nur einen Zeiger auf die eigentlichen Werte
Lektüre:
Referenz- und Wertetypen
Werttypen im allgemeinen Typsystem
Arbeiten mit .NET: Grundlagen: Wertetypen und Verweistypen
Referenz- und Wert-Typen: Was ist der Unterschied in .NET?
Da Referenz-Typen nur Zeiger sind, kommt es zur Verwirrung, wenn Referenz-Typen als Wert (VB.NET: ByVal) an Funktionen und Methoden übergeben werden. Da lediglich der Zeiger übergeben wird, kann das Objekt auch außerhalb er aufzurufenden Methode verändert werden. Das hat das gleiche Verhalten, wie bei Werte-Typen die als Referenz (VB.NET: ByRef; C# ref) übergeben werden.
Wieso die Verwirrung?
Da die Schlüsselworte ByRef und ByVal in VB.NET immer explizit angegeben werden müssen, werden sie natürlich auch immer genutzt, sind immer sichtbar. Man nutzt ByRef deshalb viel zu oft, ohne zu wissen, dass es oftmals gar nicht nötig ist.
In C# muss das Schlüsselwort ref dagegen nur angegeben werden, wenn wirklich etwas als Referenz übergeben werden muss. Das hat zur Folge, dass dieses Schlüsselwort nicht permanent sichtbar ist, man macht sich weniger Gedanken über die Art der zu übergebenden Parameter.
Also merken: In VB.NET kann ByVal eben auch ByRef sein, wenn es sich bei dem TypParameter um einen Referenz-Typ handelt! ;-)