tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
6
ZUGRIFFE
305
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    luigied luigied ist offline Mitglied Silber
    Registriert seit
    Mar 2007
    Beiträge
    77
    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"
    ?>

  2. #2
    Steiner_B Steiner_B ist offline Mitglied Platin
    Registriert seit
    Mar 2004
    Ort
    Wien
    Beiträge
    573
    Mal eine ganz dumme Frage: Aber wo liegt jetzt genau der Unterschied zwischen
    Code vb:
    1
    
    getPointerTo(myBeautifulObject).beautifulMemberFunction()
    und
    Code vb:
    1
    
    beautifulMemberFunction.beautifulMemberFunction()

    Soweit ich mich in VB auskenne müsste doch beautifulMemberFunction auch schon eine Referenz sein?
     

  3. #3
    Avatar von Shakie
    Shakie Shakie ist offline Mitglied Diamant
    Registriert seit
    May 2004
    Ort
    Europa
    Beiträge
    2.048
    Das ist...Schmarrn. Die Funktion castet lediglich das Objekt (vom Typ X) in den Typ 'Object'. Das geht auch direkt mittels CType
    Code vbnet:
    1
    
    CType(myBeautifulObject, Object)
    Aber ich sehe spontan keinen Grund, warum man diesen Typecast häufig brauchen könnte. Mit Pointern hat das übrigens nichts zu tun.

    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²

  4. #4
    luigied luigied ist offline Mitglied Silber
    Registriert seit
    Mar 2007
    Beiträge
    77
    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"
    ?>

  5. #5
    Steiner_B Steiner_B ist offline Mitglied Platin
    Registriert seit
    Mar 2004
    Ort
    Wien
    Beiträge
    573
    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
     

  6. #6
    luigied luigied ist offline Mitglied Silber
    Registriert seit
    Mar 2007
    Beiträge
    77
    Ö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"
    ?>

  7. #7
    Avatar von Nico Graichen
    Nico Graichen Nico Graichen ist offline aka gemballa
    tutorials.de Moderator
    Registriert seit
    Dec 2003
    Ort
    Pulheim (NRW)
    Beiträge
    3.898
    Blog-Einträge
    34
    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 Zitat von Mark Twain (1835-1910)
    Es gibt drei Dinge, die eine Frau aus dem Nichts hervorzaubern kann: einen Hut, einen Salat und einen Ehekrach.
    Zitat Zitat von Mike Wilson - Biographie über Larry Ellison (CEO Oracle)
    The Difference Between God and Larry Ellison: God Doesn't Think He's Larry Ellison

Ähnliche Themen

  1. [c++] Pointer auf konstanten Pointer-Parameter setzen
    Von digitalFreeman im Forum C/C++
    Antworten: 4
    Letzter Beitrag: 18.02.09, 11:11
  2. Invalid Pointer Addition.. wo is denn da n pointer !
    Von GartenUmgraben im Forum Borland CBuilder und VCL
    Antworten: 3
    Letzter Beitrag: 29.07.06, 16:48
  3. Antworten: 4
    Letzter Beitrag: 07.07.06, 13:34
  4. Antworten: 1
    Letzter Beitrag: 22.12.05, 09:27
  5. Antworten: 6
    Letzter Beitrag: 02.11.03, 21:23