ERLEDIGT
NEIN
NEIN
ANTWORTEN
6
6
ZUGRIFFE
305
305
EMPFEHLEN
-
Da VB .NET nicht den Umgang mit Pointern im "herkömmlichen" Sinne unterstützt, dachte ich mir, ich veröffentliche hier mal mein kleines Workaround.
Wahrscheinlich werden die Meisten hier diesen Weg schon ewig anwenden, aber aus eigener Erfahrung weiss ich, dass man als Neulin an diesem Problem verzweifeln kann.
Code :1 2 3
Public Function getPointerTo(ByRef obj As Object) As Object Return obj End Function
Da in VB .NET Call-by-Reference über das Schlüsselwort ByRef vor dem Parameter realisiert wird, kann man sich auf diese Weise den Pointer zu einem Objekt holen.
Gearbeitet werden kann damit dann ganz normal über
Code :1
getPointerTo(myBeautifulObject).beautifulMemberFunction()
ACHTUNG: In VS funktioniert an dieser Stelle das Intellisense nicht, also vorsicht vor Tippfehlern. Sonst fliegt euch zur Laufzeit euer Programm um die Ohren.
Ich hoffe, ich konnte einigen Neulingen den Einstieg in VB .NET erleichtern.
mfg LuigiEd<?php
getRich() or die "trying"
?>
-
Mal eine ganz dumme Frage: Aber wo liegt jetzt genau der Unterschied zwischen
undCode vb:1
getPointerTo(myBeautifulObject).beautifulMemberFunction()
Code vb:1
beautifulMemberFunction.beautifulMemberFunction()
Soweit ich mich in VB auskenne müsste doch beautifulMemberFunction auch schon eine Referenz sein?
-
Das ist...Schmarrn. Die Funktion castet lediglich das Objekt (vom Typ X) in den Typ 'Object'. Das geht auch direkt mittels CType
Aber ich sehe spontan keinen Grund, warum man diesen Typecast häufig brauchen könnte. Mit Pointern hat das übrigens nichts zu tun.Code vbnet:1
CType(myBeautifulObject, Object)
Dass IntelliSense nicht funktioniert ist logisch, da IntelliSense nur ein 'Object' sieht und entsprechend nur die 'Object'-Methoden anzeigen kann.Geändert von Shakie (18.07.11 um 16:07 Uhr)
hihi = -h²
-
Ok, das gewählte Beispiel ist vlt. nicht sonderlich sinnvoll, aber es gibt Fälle, wo man einfach eine Referenz benötigt. Gerade bei Oberflächenprogrammierung habe ich das jetzt öfters benötigt.
Ich habe eine Treeview die ich vorher dynamisch gefüllt hatte und deren Tag-Element ich ein Objekt zugewiesen habe. Beim Doppelklick auf ein é Node wird das Objekt in einer Variable zwischen gespeichert und beim anschließenden Doppelklick auf eine andere Node, wird dem ersten Objekt die ID des 2. und umgekehrt an eine Memberfunktion übergeben.
Ohne Referenz würde ich jetzt nur zwar dem zweiten Objekt die ID des 1. übergeben, nicht aber umgekehrt, da lediglich die Funktion des zwischengespeicherten Objektes (also der Kopie) aufgerufen wird und nicht die Funktion des Originalobjektes.
Das fällt dann beim Speichern der Daten auf.
Ich habe auch keine Lust jedes Mal die Treeview rekursiv durchzuwursten, bis ich das Originalobjekt gefunden habe und das mit der geänderten Kopie überschreiben kann.
Ich finde spontan, dass meine Lösung fixer ist.
mfg
PS: Sorry, wegen dem dämlichen Beispiel, aber ich war tippfaul.
<?php
getRich() or die "trying"
?>
-
Ich arbeite zwar hautsächlich mit c#, aber ich bin mir ziemlich sicher das auch in VB.net (mit Ausnahme von Primitiven Datentypen) alle Objekte immer Referencen sind. Somit müsstest du von einem TreeNode auch immer eine Reference bekommen und keine Kopie.
Einfaches Beispiel:
Code vb:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
Sub Main() Dim a As TreeNode Dim b As TreeNode a = New TreeNode a.Tag = 5 MsgBox(a.Tag) b = a a.Tag = 9 MsgBox(a.Tag) MsgBox(b.Tag) End Sub
Die Ausgaben hier sind 5, dann 9 und nochmals 9. Hier sieht man sehr schön das b nur eine Referenze auf a ist und der Wert von b.x somit mitgeändert wird.Geändert von Steiner_B (18.07.11 um 18:34 Uhr) Grund: Beispiel nochmal verbessert
-
Öhm, wenn du dir da sicher bist, glaube ich dir das und sag mal "mein Fehler". Mich wundert allerdings, dass es nach deiner Variante bei mir nicht funktioniert hat. Und nach meiner wurde der Wert geändert. Ich bin mir auch sicher, dass ich nix anderes geändert hatte. Komisch
<?php
getRich() or die "trying"
?>
-
Steiner_B hat Recht! .NET ist komplett objektorientiert und alle Reference-Types werden, wie der Name schon sagt, auch als Referenz übergeben.
Einzig Value-Types werden als Wert übergeben. Dazu zählen Structs, Build-in-Typen, alle Benutzertypen, die von System.ValueType erben und string (Mischling, liegt zwar auf dem Heap, wird aber ByVal übergeben)Grüße Nico
----------------------
Xing
----------------------
Zitat von Mark Twain (1835-1910)
Zitat von Mike Wilson - Biographie über Larry Ellison (CEO Oracle)
Ähnliche Themen
-
[c++] Pointer auf konstanten Pointer-Parameter setzen
Von digitalFreeman im Forum C/C++Antworten: 4Letzter Beitrag: 18.02.09, 11:11 -
Invalid Pointer Addition.. wo is denn da n pointer !
Von GartenUmgraben im Forum Borland CBuilder und VCLAntworten: 3Letzter Beitrag: 29.07.06, 16:48 -
[C] Prüfen, ob Inhalt von Pointer auf Pointer existiert
Von mc_gulasch im Forum C/C++Antworten: 4Letzter Beitrag: 07.07.06, 13:34 -
Aus Zwei Pointer Arrays mache ein Pointer Array
Von janosch im Forum C/C++Antworten: 1Letzter Beitrag: 22.12.05, 09:27 -
[C++] Objekt Pointer zuweisen und Methoden auf Pointer realisieren?
Von Ezzz im Forum C/C++Antworten: 6Letzter Beitrag: 02.11.03, 21:23





Zitieren

Login





