vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
Blitzschnelles Erstellen von grafischen Diagrammen!  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

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.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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?
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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 &&.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

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