Wie übergebe ich eine Variable, als Referenz an eine andere Klasse?

  • VB.NET

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von Neltian.

    Wie übergebe ich eine Variable, als Referenz an eine andere Klasse?

    Hallo zusammen,

    Ich versuche eine Variable, vom Typ Boolean, aus meiner Startform an eine andere Klasse als Referenz zu übergeben. Nach dem die Klasse ihre Aufgabe erledigt hat, prüfe ich in der Form welchen Wert der Boolean hat und anhand des Ergebnisses geht es dann weiter. Das Problem dabei ist, obwohl ich im Konstruktor der Klasse ein Argument als Referenz verlange wird der Wert in der Form nicht geändert nachdem ich den Wert geändert habe.

    Hier der Code den ich fix zum ausprobieren geschrieben habe.

    Die Form:

    Quellcode

    1. Public Class Form1
    2. Private _myRef As Boolean
    3. Private Sub btn_check_Click(sender As Object, e As EventArgs) Handles btn_check.Click
    4. Dim change As New changeRef(_myRef)
    5. If _myRef = True Then
    6. lbl_check.Text = "myRef ist jetzt True!"
    7. ElseIf _myRef = False Then
    8. lbl_check.Text = "myRef ist immer noch False!"
    9. End If
    10. End Sub
    11. End Class


    Und die Klasse die den Wert ändern soll:

    Quellcode

    1. Public Class changeRef
    2. Public _myRef As Boolean
    3. Sub New(ByRef myRef_ As Boolean)
    4. ' TODO: Complete member initialization
    5. _myRef = myRef_
    6. change()
    7. End Sub
    8. Sub New()
    9. ' TODO: Complete member initialization
    10. End Sub
    11. Sub change()
    12. _myRef = True
    13. End Sub
    14. End Class



    ich weiß nicht ob ich ein Brett vor dem Kopf habe... warum funktioniert es so nicht?

    Schon im Voraus danke für eure Zeit
    Neltian
    Ich geh mal stark davon aus, dass du die Klasse noch stark erweitern wirst, denn ansonsten würde das mMn keinen Sinn ergeben einen Konstruktor zur Änderung einer Variablen (scheinbar only) zu verwenden.

    Ich würde die Methode change eher als Shared deklarieren (sollte eig gehen in dem Fall), aber ich weiß ja nicht was dein Plan ist. change ist an sich auch der falsche Ausdruck. Eher würde setTrue passen, change wäre eher das hier:

    VB.NET-Quellcode

    1. _myRef = Not _myRef


    Ansonsten deklarier halt eine Public Shared Variable in der du die Instanz der Mainform speicherst und über die kannst du dann auch auf die jeweilige Variable zugreifen.

    Noch son Tipp am Rande:
    If überprüft bereits auf True, da musst du nicht extra

    VB.NET-Quellcode

    1. If Variable = True
    prüfen, sondern das hier würde auch schon reichen

    VB.NET-Quellcode

    1. If Variable
    Polling is trolling!

    Achtung: Ich habe die komische Angewohnheit, simple Dinge zu verkomplizieren..

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Rootbob91“ ()

    Um darauf einzugehen, warum die Variable außerhalb nicht verändert wird:

    VB.NET-Quellcode

    1. Public Class changeRef
    2. 'Boolean (kein Pointer)
    3. Public _myRef As Boolean
    4. 'myRef_ ist ein Boolean-Pointer
    5. Sub New(ByRef myRef_ As Boolean)
    6. 'Hier wird der Pointer dereferenziert und der Wert nach _myRef kopiert.
    7. _myRef = myRef_
    8. 'Hier wird einfach der Wert in der Variable überschrieben.
    9. '_myRef ist kein Pointer, deshalb kann auch nicht an einer Adresse geschrieben werden.
    10. _myRef = True
    11. End Class

    Wenn ich mir mal eine Mischung aus C-Pointern und VB erlauben darf...
    Man müsste die changeRef-Klasse so abändern, dass es funktioniert:

    VB.NET-Quellcode

    1. Public Class changeRef
    2. 'Das hier als Pointer deklarieren
    3. Public _myRef As Boolean*
    4. Sub New(ByRef myRef_ As Boolean)
    5. 'Pointer wird nicht dereferenziert, sondern kopiert.
    6. _myRef = myRef_
    7. End Sub
    8. Sub change()
    9. 'Pointer wird dereferenziert und an der Adresse (Variable außerhalb) wird True geschrieben.
    10. *_myRef = True
    11. End Sub
    12. End Class

    Das Arbeiten mit Pointern ist in .Net grundsätzlich möglich, aber von VB wird das nicht so ohne weiteres unterstützt. Bei C# würde man Unsafe verwenden.

    Aber:
    Abgesehen von den komischen Namenskonventionen scheinst Du was zu versuchen, was man eventuell besser lösen könnte. Wenn Du uns erzählst, was Du vor hast, können wir Dir eventuell anders weiterhelfen.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils
    @Neltian Du musst nach dem Ändern der Variable in der Klasse den Rückgabewert noch setzen.
    Wir sind hier nicht bei C++, wo Du einen Boolean-Pointer übergibst, sondern Du übergibst Objekte.
    Dies funktioniert:

    VB.NET-Quellcode

    1. Sub New(ByRef myRef_ As Boolean)
    2. ' TODO: Complete member initialization
    3. _myRef = myRef_
    4. change()
    5. myRef_ = _myRef ' dies hier
    6. End Sub

    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Hallo zusammen,

    die Ausgangslage war eigentlich die, dass ich ein fremdes Projekt anpassen sollte. Dort wollte ich nach dem schließen eines Fensters nachvollziehen ob bestimmte Dinge getan wurden oder nicht getan wurden, um darauf entsprechend reagieren zu können. Darum der Boolean.

    Das Beispiel habe ich nur schnell zum Testen runtergeschrieben und sollte so nicht weiter verwendet werden. Sorry das die Namen vielleicht etwas verwirrend sind. Die Variabel sollte eigentlich klassenweit verfügbar sein und nicht nur im Konstruktor. Darum die zuweisung zur Private in der Klasse. Das die Methode im konstruktor direkt ausgeführt wird war nur bequemlichkeit und entspricht nicht dem eigentlich beabsichtigten Ablauf. Trotzdem war das Beispiel von RodFromGermany ein einleuchtender Punkt was die dereferenzierung angeht.

    Ich wusste das ich das Problem auch anders lösen kann, z.B. durch eine shared Variable. Ich wollte aber einfach wissen warum es so nicht geht. Der irrglaube, dass es so geht entstand dadurch, dass mein Ausbilder und ich beim Diskutieren über das Problem aneinander vorbei geredet haben. ^^ Nun ist mir klar warum es so nicht gehen kann.

    Vielen Dank euch allen für eure Erklärungen und Zeit.
    Neltian