+ und & zum Verketten von Strings / Frühes und spätes Binden

  • VB.NET

Es gibt 14 Antworten in diesem Thema. Der letzte Beitrag () ist von der_Kurt.

    + und & zum Verketten von Strings / Frühes und spätes Binden

    Hallo,

    ich habe 2 Fragen zu VB wozu ich nichts befriedigendes über Tante G gefunden habe und zwar:

    1) wenn ich eine Zeichenfolge zusammenkette, kann in den String mit + und mit & verketten. Was ist zwischen + und & der Unterschied ?

    Beispiel:

    VB.NET-Quellcode

    1. Dim neuertext as String = text1 + text2 & text3


    2) Kann mir das Late und Early Bind jemand erklären ? Auf anraten habe ich option strict on gemacht und will auch sauber in VB programmieren. Ich bin in meinem Programm von 98 auf 19 Fehler runter. Von den 19 Fehlern sind 15 "Option Strict on lässt spätes Binden nicht zu". Codeausschnitt:

    VB.NET-Quellcode

    1. Dim s As Array = Split(EDICommands(2), ":")
    2. Auftrag.UNH.NachrichtenArt = s(0)


    Dort bekomme ich die Meldung dass spätes Binden nicht zugelassen wird - er meckert das s(0) an. Das ganze ist in einer Funktion. Wäre ein frühes Binden was für ihn ok wäre dann ausserhalb der Funktion ? Oder wie habe ich mir den Unterschied von früh und spät vorzustellen ? Ich habe das s doch vor der Benutzung mit Dim s as array deklariert. Ich weiss dass Ihr das hier ( [VB 2010] Frühes Binden - was steckt dahinter? ) auch erklärt, aber ich sage doch dass s vom Typ Array sein soll. Was ist ihm daran also nicht klar ?

    Gruß
    Charly

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

    Hallo,
    zwischen "+" und "&" Operator gibt es bei der Verarbeitung von Strings eigentlich keinen Unterschied. Oft wird aber versucht mit Ziffern-Eingaben aus Textboxen nach dem Motto zu rechnen.

    VB.NET-Quellcode

    1. Dim Ergebnis as Integer = Textbox1.text + Textbox2.text
    was greulicher Kot ;(
    Deshalb ist Option Strict On sowieso richtig und die konsequente Verwendung von "+" als Rechenoperator für Zahlen und "&" als Verkettungsoperator für Strings erleichtert die Lesbarkeit des Codes.

    Zur späten Bindung gabs schonma schöne Erklärungen, find ich aber grad nich. Es ist so, dass du theoretisch eine Variable ohne Typangabe instanzieren kannst. Erst, wenn der variable ein Wert zugewiesen wird, erkennt VB, was das fürn Typ ist (Integr, Double, String) Das ist späte Bindung.
    Deswegen gilt: Dim Variable as Wertetyp oder z.B. Dim Objekt as New Klasse. Damit wird eine Variable festgelegten Typs im Arbeitsspeicher angelegt. Damit kann nur noch ein Wert dieses Typs in die variable geschrieben werden >> frühe Bindung.

    Ich hoffe, ich hab nich zuviel Sch... erzählt, sonst bitte berichtigen

    Fiel Fergnügen
    Vatter
    :thumbsup: Seit 26.Mai 2012 Oppa! :thumbsup:
    Hey Vatter,

    danke für Deine Antwort. Das mit dem + und & klingt einleuchtend und so werde ich das dann handhaben. Ich dachte vielleicht gibts da noch einen internen Unterschied für VB wie er dann damit umgeht. Dann werde ich es entsprechend wie beschrieben benutzern - so klingt es auch für mich erstmal logisch und lesbar.

    Das mit dem frühen und späten Binden peil ich immer noch nicht ganz.

    Oben siehst Du dass ich mit Dim S als Array deklariere und dem auch GLEICH einen Wert zuweise. Warum meckert er dann eine Zeile tiefer über das s ? Wäre dem s nicht schon ein Wert zugewiesen worden wäre es ein spätes binden. So müsste es wie ich es aber geschrieben habe ein frühes binden sein. Oder seh ich den Wald vor lauter Bäumen nicht mehr ?

    Das müsste doch frühes binden sein:

    VB.NET-Quellcode

    1. Dim s As Array = Split(EDICommands(2), ":")
    2. Auftrag.UNH.NachrichtenArt = s(0)


    Das müsste doch spätes binden sein:

    VB.NET-Quellcode

    1. Dim s As Array
    2. s = Split(EDICommands(2), ":")
    3. Auftrag.UNH.NachrichtenArt = s(0)


    Aber VB sagt mir ganz klar schon oben bei dem ersten Beispiel dass dies spätes Binden ist.
    Strict on verleitet dich, dir Gedanken über die Datentypen zu machen, die du verwendest.
    ZB.

    VB.NET-Quellcode

    1. Dim s As Array = Split(EDICommands(2), ":")
    2. Auftrag.UNH.NachrichtenArt = s(0)
    Warum ist s As Array deklariert?
    Was ergibt sich als Datentyp von s(0)? Object, oder? Was ist UNH.NachrichtenArt - ist das Typ Object? Sicher nicht, sonst käme nicht der Fehler.

    s ist also doch wohl ein String-Array, und sollte daher auch so deklariert sein:

    VB.NET-Quellcode

    1. Dim s As String() = Split(EDICommands(2), ":")
    2. Auftrag.UNH.NachrichtenArt = s(0)
    Falls UNH.NachrichtenArt ein String ist geht das.
    Nicht ganz: (Edit: Das Nicht ganz geht an Hellfire, nicht an ErfinderDesRades)
    Dim s As Array = Split(...)
    ist nur die Kurzschreibweise von
    Dim s As Array
    s = Split(...)

    Das wird meines Wissens gleich gehandhabt.

    Die Funktion Split() kenne ich so nicht. Ich kenne nur das Splitten von Strings. Dazu gibt es im Tipps & Tricks und Tutorial Bereich eine Liste der "bösen" VB6 Funktionen. Split() ist eine davon.

    Ich mache jetzt mal eine grobe Annahme und sage, dass EDICommands ein String Array ist. Also es werden Zeichenfolgen wie diese: "Das ist eine Zeichenfolge" in diesem Array aufgelistet. EDICommands(2) ruft das dritte Element ab (weil Nullbasiert), welches darum vom Typ String ist. Instanzen von String besitzen die Funktion .Split(), welche nur den Delimeter (also ":"c) benötigt.
    Also die Zeile s = Split(EDICommands(2), ":") sollte heißen s = EDICommands(2).Split(":"c). Das c am Ende von ":"c bedeutet, dass es sich um ein einzelnes Zeichen handelt, nicht um eine Zeichenfolge. ":" ist eine Zeichenfolge mit der Länge 1, ":"c ist nur ein einziges Zeichen (Datentyp Char, welcher von .Split() erwartet wird).

    Zur Deklaration: Array umfasst eine weite Gruppe von Datentypen. Ich kenne im Moment keinen, der nicht funktioniert. Eine "bessere" Variante Arrays zu deklarieren ist an den Name des Arrays zwei Klammern anzuhängen. Es ist wenn ich mich nicht irre auch möglich beim Datentyp die Klammern zu machen.

    VB.NET-Quellcode

    1. Dim s() As String
    2. 'oder
    3. Dim s As String()

    Ich verwende immer die obrige Variante. Aber ich würde Empfehlen die Meinungen anderer User auch anzuhören.

    Also Dim s() As String ist frühes Binden.

    Edit: Weil ErfinderDesRades Objects erwähnt: Man sollte den Datentyp Object nur verwenden wenn es unbedingt nötig ist.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils
    Auftrag.UNH.NachrichtenArt ist ein String. Mhhh .... für mich als PHP Programmierer ist alles was mit Klammern zu tun hat ein Array. Ein Split erzeugt für mich (php explode) gedanklich ein Array. Daher habe ich s als Array deklariert, da ich von ausgehe dass Split das Resultat als Array zurückgibt und es auch in selbiges speichern will.

    Warum sollte ich s dann als String deklarieren ?

    Also eigentlich müsste ich doch um mit den Datentypen korrekt zu sein folgendes schreiben:

    VB.NET-Quellcode

    1. Dim s As Array = Split(EDICommands(2), ":")
    2. Auftrag.UNH.NachrichtenArt = CStr(s(0))


    S wäre ein Array und das Rückggabe Resultat von Split auch. Das müsste doch also passen. Da die Nachrichtenart ein String ist würde ich es mit CStr konvertieren.

    Schreibe ich es wie Du geschrieben hast dann passt es. Aber für mich sieht das irgendwie unlogisch aus. Ich definiere es als String aber es ist ein Array ? *confused*
    s wird bei Dim s() As String nicht als String deklariert, sondern als 1-dimensionales Array von String. Vielleicht veranschaulicht das es etwas:
    Dim s() As String deklariert ein 1-dimensionales Array von String mit beliebig vielen "Plätzen".
    Dim s(4) As String deklariert ein 1-dimensionales Array von String mit genau 5 Plätzen: 0, 1, 2, 3, 4. Das sind genau 5. (nicht verwechseln!)
    Dim s(,) As String deklariert ein 2-dimensionales Array von String mit beliebig vielen Plätzen.
    Dim s(6,15) As String deklariert ein 2-dimensionales Array von String mit genau 7 Plätzen in einer Dimension und 16 Plätzen in der zweiten. Das Gesamte Array ist also 7 * 16 = 112 Plätze groß. (Angesprochen wird es so: Irgendwas = s(Index1, Index2).

    Auf Grund der Tatsache das spätes Binden möglich ist (zwar durch Option Strict On nicht erlaubt, aber möglich) erhält s in jedem Fall den Datentyp String() (also ein 1-dimensionales Array von String). s(2) ist also in jedem Fall vom Typ String. Das bedeutet das Umwandeln von String in String mittels CStr() ist unsinnig.
    (Da gibt es auch die .ToString() Funktion. Diese gibt es für so ziemlich alle Datentypen in .Net).
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils

    Hellfire schrieb:

    Auftrag.UNH.NachrichtenArt ist ein String. Mhhh .... für mich als PHP Programmierer ist alles was mit Klammern zu tun hat ein Array. Ein Split erzeugt für mich (php explode) gedanklich ein Array. Daher habe ich s als Array deklariert, da ich von ausgehe dass Split das Resultat als Array zurückgibt und es auch in selbiges speichern will.

    Warum sollte ich s dann als String deklarieren ?

    Alle deine Gedanken sind richtig. Nur in Net sind alle Arrays verschieden. Ein String-Array ist etwas anneres als ein Integer-Array.

    Niemand hat gesagt, du sollest s als String deklarieren, sondern als String-Array, und das geht so:

    VB.NET-Quellcode

    1. dim s As String()
    mit Klammern dran.
    Jup. Danke euch allen. Den Gedankengang habe ich verstanden. Ich unterscheide halt nach dem was in dem Array gespeichert wird, so kann es sein dass man es als String / Int oder was auch immer Array deklariert (je nach Inhalt der Keys). In php habe ich mir darüber nie Gedanken gemacht.

    In PHP konnte ich zum Beispiel auch so Arrays definieren wie

    $meinhaus["ersterstock"] = "Kinderzimmer";

    Muss ein Array immer über die Zahlen dahinter definiert werden, oder kann man für die Keys in VB auch Namen vergeben ? In meiner jetzigen Software habe ich dafür eine verschachtelte Structure aufgebaut.

    Anmerkung:
    Ich bin jetzt von 98 Fehlern auf 0 runter und auf dem Weg ein besserer VB Programmierer zu werden *grins*. Danke !
    Andere Datentypen für Keys als Integer habe ich noch nie gefunden. Das lässt sich nur indirekt machen oder über ein Dictionary mit den entsprechenden Keys und Values zu den Keys.
    Dim Irgendwas As New Dictionary(Of String, Integer)
    Beim Hinzufügen mit .Add() muss dann als Key ein String angegeben werden (z.B. "Das") und der Wert als Integer (z.B. 5).
    Wenn man einen Wert zu einem Key abfragen will verwendet man .Item() und gibt den Key an. Falls es ein Paar mit diesem Key gibt wird der Wert zurückgegeben. In diesem Fall ein Integer.
    Aber Dictionaries für 0815 Aufgaben anstelle von Arrays zu verwenden ist einfach unnötig viel Aufwand.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils
    @Hellfire: Wenn du dir nicht sicher bist, kannst du ein Feature von VB benutzen: die implizite Typkonvertierung.
    Wenn du die "As Datentyp"-Klausel weglässt, weist VB dem Objekt (deiner Variable "s"') automatisch den passenden Datentyp zu. Wenn du mit der Maus darüber fährst, kannst du diesen sehen, und in deinem Programm weiterverwenden.
    Bilder
    • implizite Typkonvertierung.png

      5,89 kB, 380×126, 227 mal angesehen

    der_Kurt schrieb:

    @Hellfire: Wenn du dir nicht sicher bist, kannst du ein Feature von VB benutzen: die implizite Typkonvertierung.
    Wenn du die "As Datentyp"-Klausel weglässt, weist VB dem Objekt (deiner Variable "s"') automatisch den passenden Datentyp zu. Wenn du mit der Maus darüber fährst, kannst du diesen sehen, und in deinem Programm weiterverwenden.

    Also da stellt sich hier ja für jeden die Frage, ob der_Kurt ein dunkles Windows Design hat, oder ob er einfach nur die Farben in der IDE verändert hat. 8|

    der_Kurt schrieb:

    @Hellfire: Wenn du dir nicht sicher bist, kannst du ein Feature von VB benutzen: die implizite Typkonvertierung.
    Wenn du die "As Datentyp"-Klausel weglässt, weist VB dem Objekt (deiner Variable "s"') automatisch den passenden Datentyp zu. Wenn du mit der Maus darüber fährst, kannst du diesen sehen, und in deinem Programm weiterverwenden.
    Mhhh .... ich habe es dahinter geschrieben, weil ich dachte das VB dann "eher" weiss was gewollt ist und was "richtig" ist. Ich dachte das wäre der "richtige" Stil, gleich anzugeben worum es sich handelt. Wäre die implizite Typkonvertierung dann nicht für alle einfacher und weniger Tipparbeit ? Der Tipp ist sehr gut, nur ich möchte mir gleich den "richtigen" Stil angewöhnen. Schlechte Gewohnheiten treibt man dann später so schlecht aus :)

    Gebt Ihr das im Programm denn selbst vor oder ist das regulär, dass man die implizite Typkonvertierung verwendet ?

    Einfacher klingt es - aber kann es dadurch eventuell zu Runtime Fehlern kommen wenn VB dann doch mal "falsch" interpretiert ?
    @Hellfire:
    aber kann es dadurch eventuell zu Runtime Fehlern kommen wenn VB dann doch mal "falsch" interpretiert ?
    VB interpretiert nicht falsch. 1 ist ein Integer, "1" ist ein String. Höchstens interpretiert der User diese Angaben falsch. Mit meinem Vorschlag kannst du rausfinden, was für ein Datentyp hier erforderlich ist...

    mir schrieb:

    ...und in deinem Programm weiterverwenden.

    Du kannst diesen Datentyp dann ohne Weiteres wie gewohnt angeben.

    Zur Bemerkung "richtigen Stil" angewöhnen: Dieser Stil ist ebenso richtig wie die komplette Deklaration des Typs. Besonders bei den Neuerungen wie LINQ wird dies spürbar.
    Beispiel:

    VB.NET-Quellcode

    1. Dim i = From person In allepersonen
    2. Where person.Nachname = "" Or person.Alter < 20
    3. Select person
    4. Dim i2 As System.Collections.Generic.IEnumerable(Of Person) =
    5. From person As Person In allepersonen
    6. Where person.Nachname = "" Or person.Alter < 20
    7. Select person

    Beide Variablen bekommen den identischen Inhalt zugewiesen. Beispiel 1 wird impliziert durch die dahinterliegende LINQ-Anweisung deklariert, Beispiel 2 explizit durch die "As"-Klausel. (Bei "Person" ebenso).
    Wie erwähnt. Der Stil ist genauso richtig. Man muss nur wissen, was man macht.

    Dies war als Hilfe gemeint, nicht als Belehrung über einen falschen Ansatz. ;)

    @Bluespide: studiostyl.es/: Farben in der IDE geändert.