| |
VB.NET - Ein- und UmsteigerÜbergabe ByVal oder ByRef | | | Autor: sv00010 | Datum: 25.10.23 08:18 |
| Ich habe gemerkt dass ich z.B. Windows.Forms als ByVal an eine Funktion übergeben kann
und dort Sachen ändere z.B. die Farbe der Schrift und diese bleiben erhalten,
wenn ich die Funktion verlasse.
Ich habe bisher bei solche Funktionen sicherheitshalber immer ByRef genommen.
Bei welchen Klassen funktioniert dies auch mit Übergabe ByVal und bei welchen funktioniert dies nicht.
Beitrag wurde zuletzt am 25.10.23 um 08:19:09 editiert. | |
Re: Übergabe ByVal oder ByRef | | | Autor: Manfred X | Datum: 25.10.23 11:19 |
| Hallo!
Die Übergabe der Instanz einer Form an eine Funktion ist gewöhnlich
kein guter Programmierstil. Aber egal ....
Wenn die Instanz eines Objekts übergeben wird, bezieht sich
ByVal bzw. ByRef nur auf die Art der Übergabe der als Parameter
übergebenen Zugriffsvariable für die Objekt-Instanz,
aber nicht auf die Instanz selbst.
Die wird bei der Übergabe nicht geclont o.ä.
Byval: Der Zeiger auf das Objekt wird lokal kopiert.
Byref: Der Zeiger auf das Objekt wird übergeben.
Bei der Byval-Übergabe kann lokal in der Funktion die als
Parameter übergebene Variable auf Nothing gesetzt oder mit einer
anderen Objektinstanz verbunden werden, ohne dass sich die Referenz
der Variable im rufenden Programm ändert.
https://learn.microsoft.com/de-de/dotnet/visual-basic/programming-guide/language-features/procedures/passing-arguments-by-value-and-by-reference
Beitrag wurde zuletzt am 25.10.23 um 11:25:19 editiert. | |
Re: Übergabe ByVal oder ByRef | | | Autor: sv00010 | Datum: 25.10.23 13:46 |
| Manfred X schrieb:
Zitat: | | Hallo!
Byval: Der Zeiger auf das Objekt wird lokal kopiert.
Byref: Der Zeiger auf das Objekt wird übergeben.
| |
Also ich wiederhole es jetzt mal so wie ich es verstanden habe.
Bei Werttypen funktioniert ByVal und ByRef ganz normal wie erwartet.
Wenn ich allerdings etwas übergebe, was vorher mit = new erst instanziiert werden musste (Verweistyp),
dann funktioniert auch ByVal, allerdings nur weil der Zeiger auf dasselbe Quellobject verweist?
Beitrag wurde zuletzt am 25.10.23 um 13:47:38 editiert. | |
Re: Übergabe ByVal oder ByRef | | | Autor: Manfred X | Datum: 25.10.23 14:14 |
| Hallo!
Richtig!
ByVal bewirkt aber, dass die Funktion keine Veränderung des
Zeigers auf das Objekt bewirken kann, die außerhalb der Funktion
sichtbar wird.
Aus diesem Grund ist die Übergabe "ByVal" meist vorzuziehen. | |
Re: Übergabe ByVal oder ByRef | | | Autor: sv00010 | Datum: 25.10.23 15:23 |
| Manfred X schrieb:
Zitat: | |
ByVal bewirkt aber, dass die Funktion keine Veränderung des
Zeigers auf das Objekt bewirken kann, die außerhalb der
Funktion sichtbar wird.
| |
Ist damit gemeint, dass das Object mit ByVal in der Funktion nicht mit
= new geändert wird oder sind davon noch andere Sachen betroffen? | |
Re: Übergabe ByVal oder ByRef | | | Autor: Manfred X | Datum: 25.10.23 18:18 |
| Wenn man in einer Funktion der mit Byval übergebenen Referenzvariable
ein neues Objekt zuweist (per New erstellt oder bereits bestehend)
ist diese Zuweisung nur innerhalb der Funktion gültig, weil dort
eine lokale Kopie der Variable (Zeiger) verwendet wird.
Hat man allerdings bereits vor dieser Neuzuweisung in der Funktion
am referenzierten Objekt Änderungen vorgenommen, werden diese Änderungen
natürlich auch im rufenden Programm wirksam, weil das Objekt selbst
nicht lokal kopiert worden ist.
Übergibt man die Referenzvariable ByRef wird bei einer Neuzuweisung innerhalb
einer Funktion diese Referenz auch im rufenden Programm wirksam und
man erhält danach Zugriff auf das neu zugewiesene Objekt.
Beispiel
Dim stb As New Text.StringBuilder("aaaa")
Dim stb1 As Text.StringBuilder = stb
Testit(stb)
'Diese Funktion liefert die Zeichenfolge aaaabbbb in der Variable stb zurück
Private Function Testit(ByVal stb As Text.StringBuilder)
stb.Append("bbbb")
stb = New Text.StringBuilder("cccc")
End Function
'Diese Funktion liefert die Zeichenfolge cccc in der Variable stb zurück
'Die Variable stb1 enthält die Zeichenfolge aaaabbbb
Private Function Testit(ByRef stb As Text.StringBuilder)
stb.Append("bbbb")
stb = New Text.StringBuilder("cccc")
End Function
Beitrag wurde zuletzt am 25.10.23 um 18:34:32 editiert. | |
Re: Übergabe ByVal oder ByRef | | | Autor: sv00010 | Datum: 26.10.23 07:58 |
| Normalerweise würde ich die Sache einfach ignorierien und einfach alle Referenzwerte
als ByRef übergeben.
Das Problem wieso mich dies überhaupt interessiert ist, dass ich im Internet gelesen habe,
dass man Doppelreferenzierungen nach Möglichkeit bleiblen lassen soll.
Leider habe ich nicht verstanden, was mit Doppelreferenzierung remeint ist. | |
Re: Übergabe ByVal oder ByRef | | | Autor: Manfred X | Datum: 26.10.23 08:35 |
| Hallo!
Vermutlich ist mit "Doppel-Referenzierung" gemeint, dass man im Code
mehrere Referenzen zur gleichen Instanz eines Objekts herstellt.
Das ist grundsätzlich kein Problem, wenn man weiß, zu welchen
Konsequenzen das führt.
Im obigen Beispiel zeigt sich so ein Effekt bei den Referenzen
stb und stb1. Man hat zunächst eine Objekt-Instanz mit zwei Referenzen
und nach Aufruf der Routine Testit - bei Übergabe mit ByRef - hat man
zwei Objekt-Instanzen mit jeweils einer Referenz.
Die Übergabe einer Referenz durch Byref gibt einer Methode die Möglichkeit,
die referenzierte Objekt-Instanz auszutauschen.
Deswegen habe ich davon abgeraten.
Extrem problematisch wird es, wenn im Programm-Ablauf
Überkreuz-Referenzen entstehen.
Vereinfacht ausgedrückt:
In der Instanz A wird einen Verweis auf B erstellt,
danach aber in der Instanz B ein Verweis auf A.
Das Verhalten von Referenzierungen zu ignorieren, ist eine ganz schlechte Idee. | |
Re: Übergabe ByVal oder ByRef | | | Autor: Kuno60 | Datum: 26.10.23 20:11 |
| Hallo,
eine Doppelreferenzierung hat nichts damit zu tun, ob man ein Argument als ByVal oder ByRef übergibt. Wie schon erwähnt wurde, ist da bei Klassen kaum ein Unterschied. Klassen sind z.B. Fenster, Steuerelemente, Klassen aus dem Framework, eigene Klassen und auch der Typ String. Strukturen kann man nur dann rückwirkend ändern, wenn sie als ByRef übergeben werden.
Zum Thema "Doppel-Referenzierung" meint die KI (ich hoffe sie hat recht 😃):
Eine Doppel-Referenzierung ist ein Begriff, der in der Programmierung verwendet wird, um eine Situation zu beschreiben, in der eine Referenz auf eine andere Referenz verweist. Eine Referenz ist ein Aliasname für ein bereits bestehendes Objekt. Eine Doppel-Referenzierung tritt auf, wenn eine Referenz auf eine andere Referenz verweist, die wiederum auf das ursprüngliche Objekt verweist.
In C++ gibt es sogenannte Lvalue-Referenzen und Rvalue-Referenzen. Lvalue-Referenzen werden durch ein an den Typ angehängtes & gekennzeichnet und Rvalue-Referenzen durch &&. | |
| Sie sind nicht angemeldet! Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.
Einloggen | Neu registrieren |
|
|
vb@rchiv CD Vol.6 vb@rchiv Vol.6
Geballtes Wissen aus mehr als 8 Jahren vb@rchiv!
Online-Update-Funktion Entwickler-Vollversionen u.v.m.Jetzt zugreifen Tipp des Monats sevAniGif (VB/VBA)
Anzeigen von animierten GIF-Dateien
Ab sofort lassen sich auch unter VB6 und VBA (Access ab Version 2000) animierte GIF-Grafiken anzeigen und abspielen, die entweder lokal auf dem System oder auf einem Webserver gespeichert sind. Weitere Infos
|
|
|
Copyright ©2000-2024 vb@rchiv Dieter Otter Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.
Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel
|
|