chrfriedel
Goto Top

VB.Net Zugriff auf Structure innerhalb eines Dictionaries

Hallo zusammen,

ich bin gerade eben über etwas gestolpert von dem ich mal einen Beispielcode verfasst habe:

Public Structure SomeStructure

        Dim ID As Integer

End Structure

Private Sub DoSomething()

        Dim Dict As New Dictionary(Of String, SomeStructure)
        Dim aStructure As New SomeStructure With {.ID = 1}
        Dict.Add("key", aStructure)  

        'Dict("key").ID = 2             'Der Ausdruck ist ein Wert und kann nicht als Ziel einer Zuweisung verwendet werden.  
        'Dict.Item("key").ID = 2    'Der Ausdruck ist ein Wert und kann nicht als Ziel einer Zuweisung verwendet werden.  

        Dim Versuch1 As SomeStructure = Dict("key")  
        Versuch1.ID = 2

        System.Diagnostics.Debug.Print(Dict("key").ID) 'Output 1  

        Dim Versuch2 As SomeStructure = Dict("key")  
        Versuch2.ID = 2
        Dict("key") = Versuch2  

        System.Diagnostics.Debug.Print(Dict("key").ID) 'Output 2  

End Sub

Zeile 14 und 15 kompilieren nicht mit der angegebenen Fehlermeldung was mich an sich schon sehr verwundert weil IntelliSense bspw. problemlos erkennt das ich gern auf ein Objekt vom Typ SomeStructure zugreifen möchte und mir die vorhandenen Variablen anbietet.

Zeile 17 und 18 funktionieren problemlos führen aber nicht zum Ziel da Versuch1 nur eine Kopie ist

Zeile 22-24 verhalten sich genau wie gewünscht, empfinde ich persönlich aber als unschön und vermute auch performanceverluste hier

Wenn ich aus der Structure eine Class mache funktioniert alles genau wie gewünscht.

Meine Frage ist ob ich Tomaten auf den Augen habe und es mein Fehler ist das vor allem Zeile 14 und 15 nicht funktionieren oder ob es tatsächlich by Design ist. Ich könnte schwören ich habe in früheren Projekten nämlich genau so programmiert. Seltsam

Bonusfrage:
Kann mir jemand einen vernünftigen Grund nennen wieso es hier keine Kategorie .Net oder wenigstens VisualBasic gibt? Dafür aber Kategorien wie KiXtart, Entwicklung:Lizenzierung und ähnlich wichtige Dinge...


Grüße

Content-ID: 264519

Url: https://administrator.de/contentid/264519

Ausgedruckt am: 22.11.2024 um 03:11 Uhr

SlainteMhath
Lösung SlainteMhath 25.02.2015 aktualisiert um 15:32:46 Uhr
Goto Top
Moin,

by Design
Genau das.

Bonusfrage:
Kann mir jemand einen vernünftigen Grund nennen wieso es hier keine Kategorie .Net oder wenigstens VisualBasic gibt? Dafür aber Kategorien wie KiXtart,
Entwicklung:Lizenzierung und ähnlich wichtige Dinge...
Das liegt wahrscheinlich daran das das hier ein Forum für Adminstratoren ist und nicht für Programmierer/Entwickler (ja ich weis das Admins in KMUs meist auch Entwickler sind face-smile )

lg,
Slainte
114757
Lösung 114757 25.02.2015 aktualisiert um 15:32:42 Uhr
Goto Top
Moin,
eine Structure ist vom Typ value type deswegen klappt die Zuweisung so nicht weil immer nur Kopien einer Structure übergeben werden, siehe auch:
http://stackoverflow.com/questions/7126318/how-do-you-assign-values-to- ...

Gruß jodel32
ChrFriedel
ChrFriedel 25.02.2015 um 15:32:38 Uhr
Goto Top
Ich dachte es mir schon... ich kanns nur immer noch nicht glauben face-smile Ich hätte viel Geld darauf gesetzt dass das früher ging. Da spielt mir mein Kopf wohl einen Streich. Für den Lerneffekt: Weißt du eventuell warum dem so ist? Da ich über den Key ja auf das Element zugreifen kann weiß der Compiler ja wo es im Speicher liegt. Es sollte doch eigentlich kein Problem sein den Wert zu überschreiben.

Grüße
ChrFriedel
ChrFriedel 25.02.2015 um 15:35:11 Uhr
Goto Top
Danke für den Link face-smile

Am besten gefällt mir:
Every .NET programmer makes this mistake once. A Structure is a value type, records(0) returns a copy.

Da bin ich wenigstens nicht alleine ;)

Grüße
114757
114757 25.02.2015 um 15:35:42 Uhr
Goto Top
Das sollte klar sein wenn du das hier ließt:
https://msdn.microsoft.com/de-de/library/s1ax56ch.aspx
ChrFriedel
ChrFriedel 25.02.2015 um 15:37:12 Uhr
Goto Top
Danke nochmal face-smile

Die andere Antwort habe ich zeitgleich geschrieben und sie war eigentlich für Slainte gedacht.