Mit Schleife Array beschreiben Basics

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Interessant, dass VB das zulässt. In C# geht das nicht. Aber um die Frage zu beantworten: Auch wenn String ein Referenzdatentyp ist, sind diese nicht veränderbar. Wenn du die Inhalte überschreiben möchtest musst du mit einem Index arbeiten

    VB.NET-Quellcode

    1. Dim hold As String() = File.ReadAllLines("test.txt")
    2. For i As Integer = 0 To hold.Length - 1
    3. hold(i) = "1"
    4. Next
    Das wär das gleiche wie sowas:

    VB.NET-Quellcode

    1. Dim Zahlen = {1, 2}
    2. For Each Zahl In Zahlen
    3. Zahl = 9
    4. Next

    Die Änderung eines Integers innerhalb der For-Schleife juckt das Array nicht, weil hier quasi nur (anfängliche Wert-)Kopien geändert werden.
    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.
    @Haudruferzappeltnoch Nö.
    Bei Deinem Code wird ein String aus einem Array in eine Variable kopiert, die dann von Dir überschrieben wird.
    Im Code von @ISliceUrPanties wird der Inhalt des Arrays mit dem betreffenden Index übereschrieben.
    Der Code von @VaporiZed ist äquivalent zu Deinem.
    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!
    Nein, das hat nichts mit Zeigern zu tun. VB kennt Zeiger im eigentlichen Sinne auch gar nicht. Einer der Gründe, warum man mit Span<T> nicht arbeiten kann.
    In C# ginge sowas

    C#-Quellcode

    1. ​void Main()
    2. {
    3. string[] values = { "AA", "AB", "AC" };
    4. unsafe
    5. {
    6. foreach (var value in values)
    7. {
    8. fixed (char* c = value)
    9. {
    10. ChangeValue(c);
    11. }
    12. }
    13. }
    14. values.Dump(); // Erweiterungsmethode von LinqPad
    15. }
    16. unsafe void ChangeValue(char* value)
    17. {
    18. for (int i = 0; value[i] != '\0'; ++i)
    19. {
    20. value[i] = '1';
    21. }
    22. }

    Ausgabe:

    Quellcode

    1. 11
    2. 11
    3. 11​

    ABER: In der Sprachdefinition ist festgehalten, dass das Ändern von verwalteten Typen nicht gemacht werden soll. Zitat
    ​Modifying objects of managed type through fixed pointers can result in undefined behavior.

    Note: For example, because strings are immutable, it is the programmer's responsibility to ensure that the characters referenced by a pointer to a fixed string are not modified. end note


    Es geht zwar, aber es ist die Verantwortung des Entwicklers, dass das nicht vorkommt und nicht die des Compilers.
    Es hat dann was quasi mit Zeigern zu tun, wenn es um Objektinstanzen von Klassen geht. Da kannst Du sowas machen.

    VB.NET-Quellcode

    1. Dim Forms = {FrmMain, FrmEditUser}
    2. For Each SingleForm in Forms
    3. SingleForm.BackColor = System.Drawing.Color.Black
    4. Next

    Eine Objekt-Manipulation ist so möglich. Das geht, weil das Klasseninstanzen sind (und somit Referenztypen), die direkt manipuliert werden können. Es wird hier also keine Kopie in SingleForm angelegt, sondern quasi nur der Verweis des eigentlichen Forms. Und somit wird dasselbe Objekt angesprochen und wird damit auch verändert.

    Was allerdings nicht geht, wäre eine Objekt-Zuweisung. Weil dann wieder nur die lokale Variable verändert wird.

    VB.NET-Quellcode

    1. Dim Button1 As Button = Nothing
    2. Dim Button2 As Button = Nothing
    3. Dim Buttons = {Button1, Button2}
    4. For Each SingleButton in Buttons
    5. SingleButton = New System.Windows.Forms.Button
    6. Next

    Da passiert dann nix mit dem ButtonArray!
    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.
    Hier mal meine hofflich abschliessende Behandlung des Themas - sorgfältig lesen!:

    VB.NET-Quellcode

    1. Dim arrButtons = {Button1, Button2}
    2. Dim strings = "hallo Welt".Split
    3. 'ein array-element legt man mittels eines Indexes fest - nichts anderes geht:
    4. Dim i = 1 ' der Index
    5. arrButtons(i) = New Button With {.Text = $"Button{i}"} ' so gehts - ob nun in einer Schleife oder nicht
    6. 'array-elemente festlegen kann man in einer For i - Schleife machen, in der man i als Index benutzt
    7. For i = 0 To arrButtons.Length - 1
    8. arrButtons(i) = New Button With {.Text = $"Button{i}"}
    9. Next
    10. 'Und mit ForEach? Haben wir in einer ForEach-Schleife einen Index zur Verfügung?
    11. For Each bt In arrButtons
    12. 'Buttons(???) = New Button With {.Text = $"Button{i}"} 'sieht nicht so aus. Daraus folgt: Geht nicht.
    13. Next
    14. 'eine ForEach-Schleife **ruft die Elemente des Arrays nur ab** - sie kann sie nicht neu festlegen (weil es gibt ja keinen Index)
    15. For Each bt In arrButtons
    16. bt = New Button With {.Text = $"Button42"} ' ja, schön, stört aber das Array nicht, weil an arrButtons(index) wird nix zugewiesen
    17. Next
    18. 'dennoch ist ForEach-Schleife nicht nutzlos. Es können ***Properties*** der Elemente geändert werden
    19. For Each bt In arrButtons
    20. bt.BackColor = System.Drawing.Color.Red
    21. Next
    22. 'ein String, eine Zahl oder sonstige primitive Typen **haben aber gar keine Properties**, bzw wenn doch, dann keine beschreibbaren
    23. For Each s In strings
    24. ' s.Length = 44 'geht nicht, String.Length ist Readonly
    25. Next
    26. 'Ich komme zurück auf das zuerst gesagte - ist wichtig und zum hinter die Ohren schreiben:
    27. ' **ein array-element legt man mittels eines Indexes fest - nichts anderes geht**:
    28. For i = 0 To strings.Length - 1
    29. strings(i) = $"string{i}" ' nichts anderes geht
    30. Next

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „ErfinderDesRades“ ()