| |
VB.NET - Ein- und UmsteigerRe: Problem beim Zugriff auf globale List (Of T) | | | Autor: FZelle (Moderator) | Datum: 13.11.12 15:02 |
| Da hast Du aber ForEach nicht wirklich verstanden.
ForEach benutzt IEnumerable um durch eine "Auflistung" zu gehen.
Diese muss in keinster weise überhaupt eine Liste sein. | |
Problem beim Zugriff auf globale List (Of T) | | | Autor: sledgehammer89 | Datum: 13.11.12 13:01 |
| Hallo Gemeinde
Ich brauch mal wieder eure Hilfe, irgendwie hakt es bei meinem Programm mal wieder an einer Stelle, die eig gar keine Probleme verursachen dürfte (das ist zumindest meine Meinung, dass sie das nicht dürfte ).
Es geht konkret darum, dass ich mir in einer Klasse eine globale Liste angelegt habe und zwar wie folgt:
Private FoundAdaptersList As New List( Of StrctAdapterCables ) Hierbei ist anzumerken, dass der Typ der Liste eine Struktur ist, die ich mir selbst angelegt habe. Der Aufbau der Struktur ist der folgende:
Public Structure StrctAdapterCables
Dim serialNumber As String
Dim adapterType As String
Dim testPoint As Integer
Dim cableStatus As EnStates
Dim ledStatus As Boolean
End Structure Ich versuch nun in einer Funktion, die IN DIESER KLASSE als Private deklariert ist, auf diese Liste zuzugreifen. Das funktioniert auch. Ich kann auch ein Element dieser Liste herauspicken aber NICHT dieses Element in irgendeiner Form ändern.
Der Code, mit dem ich das versuche, ist der folgende:
For Each adapter As StrctAdapterCables In FoundAdaptersList
If adapter.testPoint = tp Then
adapter.cableStatus = EnStates.reserved
adapter.ledStatus = LED_ON
Exit For
End If
Next adapter Kleine Anmerkung: tp wir der oben genannten Funktion als Parameter übergeben. EnStates ist eine Enumeration (ebenfalls selbst angelegt).
Das Problem (nochmal) ist jetzt, dass in der For-Next-Schleife die Variable "adapter" zwar geändert wird und auch als geändert angezeigt wird, solange ich eben in der Schleife bin, aber sobald das "Exit For" Statement kommt, ist dieser Inhalt in der globalen Liste nicht geändert worden.
Kann mir da einer sagen, wie ich dieses Element dennoch ändern kann?
Ich kenne solche Probleme, Stichwort "lokale Änderungen", aber das sollte in diesem Fall ja eigentlich nicht so sein oder? Es ist ja eigentlich eine "globale Änderung" oder irre ich?
MfG | |
Re: Problem beim Zugriff auf globale List (Of T) | | | Autor: powerzone3000 | Datum: 13.11.12 13:14 |
| Hallo,
ich würde vermuten das liegt daran, dass eine Struktur ein Wert- und kein Referenztyp (wie z. B. eine Klasse ist).
Somit änderst du nur die Laufvariable der For Each-Schleife (lokale Kopie deiner Struktur). Machst du aus deiner Structure eine Class, sollte es gehen.
edit:
Wenn du keine Klasse verwenden möchtest, könnte eine andere Lösung so aussehen (ungetestet):
Dim adapter As StructAdapterCables
For i As Integer = 0 To FoundAdaptersList.Count - 1
adapter = FoundAdaptersList(i)
If adapter.testPoint = tp Then
adapter.cableStatus = EnStates.reserved
adapter.ledStatus = LED_ON
FoundAdapterList(i) = adapter
Exit For
End If
Next adapter Die Problematik ist auch hier erklärt: http://www.knowdotnet.com/articles/boxedstructures.html
Beitrag wurde zuletzt am 13.11.12 um 13:33:02 editiert. | |
Re: Problem beim Zugriff auf globale List (Of T) | | | Autor: sledgehammer89 | Datum: 13.11.12 13:37 |
| Hallo powerzone3000,
dein Tipp mit der Klasse hat geholfen, ich kann die Werte jetzt ändern ohne mit der Wimper zu zucken. Vielen Dank dafür.
Deine Ausweichmöglichkeit dürfte eigentlich auch nicht funktionieren, denn eigentlich existiert doch kein Unterschied zwischen einer ForEach-Next- und einer normalen For-Next-Schleife oder? Zumindest was die Funktion dahinter angeht...
Ich werde mir deinen Link auch mal durchlesen, vielen Dank auch dafür. | |
Re: Problem beim Zugriff auf globale List (Of T) | | | Autor: powerzone3000 | Datum: 13.11.12 13:41 |
| Bitte
Doch, das funktioniert.
Hier wird die veränderte Struktur am Ende wieder manuell dem Listenelement zugewiesen, das macht die For Each-Schleife nicht. | |
Re: Problem beim Zugriff auf globale List (Of T) | | | Autor: sledgehammer89 | Datum: 13.11.12 13:46 |
| Ich habs auch grade in deinem Link gelesen, dass das gehen soll. Find ich ehrlich gesagt ne Schweinerei Ok, ich bin auch selbst Schuld, wenn ich mir die Unterschiede zwischen ForEach und normalem For nicht aneigne, aber wer kommt bitte auf SO nen Bockmist
Aber ich glaub, das wird jetzt Off-Topic wenn wir uns da drüber auslassen. Von daher nehm ich mal 2 Dinge mit:
1) Auf Boxing achten (das wird ja in deinem Link erklärt)
2) Lieber die normale For-Schleife verwenden bzw. mir mal die Doku durchlesen, was denn da genau der Unterschied ist.
Vielen Dank nochmal. Man lernt nie aus, proofed it once again | |
Re: Problem beim Zugriff auf globale List (Of T) | | | Autor: powerzone3000 | Datum: 13.11.12 13:52 |
| Du hast schon recht, zwische For Each und For gibt es eigentlich keinen Unterschied. Aber mit der normalen For-Schleife habe ich halt die Möglichkeit den veränderten Wertetyp wieder zurück in die Liste zu packen (boxing)
FoundAdapterList(i) = adapter Den wichtigen Unterschied den du dir aneigenen solltest ist der zwischen Value und Reference-Types, aber selbst dann kann man sich den Fehler im ersten Moment noch nicht erklären Ich hab den jedenfalls auch schon gemacht. | |
Re: Problem beim Zugriff auf globale List (Of T) | | | Autor: Manfred X | Datum: 13.11.12 13:59 |
| Hallo!
Hat sich schon erledigt ....
((( Mit dem Schleifentyp hat das nur indirekt zu tun.
Strukturen mußt Du (z.B. in Auflistungen) stets als Ganzes
lesen, die Elemente ändern und komplett wieder zuweisen.
Mit einer For Each-Schleife klappt es nur deshalb nicht,
weil Du keinen Index für die Zuweisung der geänderten Structure
hast. Oder Du läßt separat einen Index in einer Integer mitlaufen. )))
MfG
Manfred
Beitrag wurde zuletzt am 13.11.12 um 14:01:49 editiert. | |
Re: Problem beim Zugriff auf globale List (Of T) | | | Autor: sledgehammer89 | Datum: 13.11.12 14:03 |
| Hallo Manfred X,
die Erklärung leuchtet einem natürlich auch ein Es ist aber wieder so, dass dieser Unterschied zwischen den beiden For-Schleifen nicht wirklich groß beleuchtet ist. Es könnte ja nämlich theoretisch der Fall sein, dass eine ForEach durchaus im Hintegrund einen Index verwendet. Aber das wird, wie bereits gesagt, eher ein Off-Topic-Fall | |
Re: Problem beim Zugriff auf globale List (Of T) | | | Autor: FZelle (Moderator) | Datum: 13.11.12 16:49 |
| Auch der Artikel zeigt nicht worum es geht, sondern nur die Symptome die aus der Implementation entstehen. | |
| Sie sind nicht angemeldet! Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.
Einloggen | Neu registrieren |
|
|
sevOutBar 4.0
Vertikale Menüleisten á la Outlook
Erstellen von Outlook ähnlichen Benutzer- interfaces - mit beliebig vielen Gruppen und Symboleinträgen. Moderner OfficeXP-Style mit Farbverläufen, Balloon-Tips, u.v.m. Weitere InfosTipp des Monats TOP Entwickler-Paket
TOP-Preis!!
Mit der Developer CD erhalten Sie insgesamt 24 Entwickler- komponenten und Windows-DLLs. Die Einzelkomponenten haben einen Gesamtwert von 1605.50 EUR...
Jetzt nur 599,00 EURWeitere Infos
|