Mehr von Jürgen Gutsch

Mehr von Jürgen Gutsch

Empfehlungen von Jürgen Gutsch

Blog-Empfehlungen von Jürgen Gutsch

Willkommen bei ASP.NET Zone. Anmelden | Registrieren | Hilfe

Jürgen Gutsch

ASP.NET und mehr...
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! ;-)

DotNetKicks-DE Image
Posted: Montag, 16. August 2010 10:22 von Jürgen Gutsch

Kommentare

RalfE sagte:

Warum ist das verwirrend? Bei VB.NET steht halt immer der Übergabemodi da. Standardmäßig ist das ByVal, wie auch in C# und beide verhalten sich im Bezug auf Wertübergabe bei Referenztypen auch gleich.

Ich verstehe daher die "Aufregung" in deinem Artikel nicht.

# August 21, 2010 10:39

Jürgen Gutsch sagte:

Hallo Ralf,

keine Aufregung ;-)

Nur eine Feststellung:

Wenn Du ByVal ständig vor Augen hast und nicht weißt, dass nur Value Types ByVal übergeben werden, nutzt du ByRef eher auch bei Referenz Types auch wenn es nicht nötig ist. Die Verwirrung ist das Resultat, dass Du dich wunderst, dass Du den Referenz Type innerhalb der Methode nach Außen hin ändern kannst, obwohl du ihn ByValue übergeben hast.

Natürlich ist das Verhalten in C# und VB.NET das selbe, ist ja ein .NET Feature ;-) Aber viele VBler machen halt den Fehler Reference Types ByRef zu übergeben oder wundern sich über geänderte Objekte die ByVal an eine Unter-Routine übergeben wurden.

Das ist by C#-Entwicklern (nach meinen Beobachtungen) weniger der Fall.

# August 21, 2010 13:31
Anonyme Kommentare sind nicht zugelassen