Make Field Readonly

  • VB.NET

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von Peter329.

    Make Field Readonly

    Hi,
    Wenn ich eine New List(of .....) mit Dim anlege, dann schlägt mir Intellisense jedes Mal vor, dass ich das Dingens statt mit "Dim" als "ReadOnly" definieren soll. Wenn ich das tue, dann verschwindet der Hinweis und das Programm läuft weiterhin fehlerfrei. Ich habe ein Display als Beispiel angehängt.

    Tatsaächlich werden aber beide Listen während der Verarbeitung verändert, indem ich mit der .Add Methode Einträge hinzufüge und mit .Remove auch fallweise wieder entferne. Obwohl die zweite Liste mit "ReadOnly" definiert ist, klappt die Sache.

    Damit kann ich natürlich leben. Nur würde ich das halt auch gern verstehen:

    1. Warum will denn Intellisense, dass die Listen "ReadOnly" gemacht werden ?
    2. Welchen Effekt hat denn "ReadOnly", wenn ich die Liste immer noch verändern kann ?

    Es handelt sich also nur um Verständnisfragen. Kann mir jemand das (nachsichtig) erklären ?

    LG
    Peter
    Bilder
    • MakeReadOnly.jpg

      18,74 kB, 551×211, 45 mal angesehen

    Peter329 schrieb:

    Tatsaächlich werden aber beide Listen während der Verarbeitung verändert
    Nein.
    Die Instanz der Liste bleibt erhalten, nur der Inhalt ändert sich.
    Das ist wie ein Haus, dessen Bewohner permanent wechseln, die Postadresse aber bleibt.
    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!
    @RodFromGermany +1 von mir für die Metapher mit dem Haus! Ich hätt's nicht besser erklären können.
    @Peter329 Der Vorschlag mit ReadOnly hat noch mehr Gründe:
    1.) Der Compiler kann mehr optimieren.
    2.) Du kannst nicht versehentlich diese Liste mit
    = Nothing versehen. Dann wird der Compiler meckern und du siehst deinen Fehler.
    Testet mal diesen Code:

    VB.NET-Quellcode

    1. Public Class Form1
    2. ReadOnly MyList As New List(Of Integer)
    3. Private MyList2 As New List(Of Integer)
    4. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    5. MyList.Add(42)
    6. MyList2.Add(42)
    7. End Sub
    8. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    9. DoAny(MyList)
    10. DoAny(MyList2)
    11. End Sub
    12. Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    13. MessageBox.Show(MyList(0).ToString())
    14. MessageBox.Show(MyList2(0).ToString())
    15. End Sub
    16. Private Sub DoAny(ByRef myList As List(Of Integer))
    17. myList = Nothing
    18. End Sub
    19. End Class
    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!
    Erinnert mich ein wenig daran, was passiert, wenn man bei XXX.TryParse als 2. Parameter ein Nothing übergibt.
    Wobei hier das Debugging ein wenig tricky ist. Setzt man einen Haltepunkt in Zeile#19 oder ein Stop direkt danach, kann man nicht mehr auf den "wahren" Inhalt von MyList aus Z#2 zugreifen, wenn der Debugger dort anhält, weil der Methodenparameter genauso heißt. Wird der Parameter aber umbenannt, sieht man, was mit MyList tatsächlich (nicht) passiert.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Herzlichen Dank für die kompetenten Erklärungen ... jetzt verstehe ich das ... letzten Endes befolge ich die Intellisense Empfehlung und gut isses ...

    Ihr habt meinen Tag gerettet ... :)

    LG
    Peter