none
vs2010: automatisches overloading aller string-funktionen? RRS feed

  • Frage

  • hallo, wie man im Bild sieht, gibt es eigentlcih nur eine Funktionsdeklaration. Mein VS2010 findet aber zwei??

    Ist mein VS2010 korrupt?

    Geht mit string-Funktionen mit beliebigen Namen, nicht jedoch wenn das Funktionsergebnis integer oder objekt oder double ist.

    Mittwoch, 17. Juli 2013 08:32

Antworten

  • Da du einen String zurückbekommst, kann dieser auch umgedeutet werden als Char-Array. Und in dem Fall wäre in der Klammer der Index des Zeichens zu finden.

    Gibst du also tstfunc() an, ist es einfach dein kompletter Returnwert,

    nimmst du hingegen tstfunc(0), ist es nur das erste Zeichen von eben diesem Stringwert.

    Also eigentlich alles korrekt im VS. ;-)

    Und dass das bei Integer, Double oder Object nicht klappt, ist umgekehrt auch klar.


    LG, Dennis.

    EDI Consultant/Developer

    Ich nutze meistens VB6 und VS2005 bis VS2012

    Bitte die Antworten sowie weitere hilfreiche Beiträge von Mitgliedern markieren. Vielen Dank.

    • Als Antwort vorgeschlagen Heslacher Mittwoch, 17. Juli 2013 08:50
    • Als Antwort markiert Stefan Hoffmann2 Donnerstag, 18. Juli 2013 07:50
    Mittwoch, 17. Juli 2013 08:46
  • Hallo,

    nein nicht nur "normal" bei Visual Basics Mehrfach-Verwendung von runden Klammern.

    Zum einen kennhzeichnet () eine Methode (Prozedur/Funktion) ohne Parameter - und ist optional, auch wenn das nicht zur Lesbarkeit beiträgt.

    Zum anderen werden runde Klammen auch für den Zugriff auf indizierte Eigenschaften (Indexer) verwendet - bei String ist das die Chars Eigenschaft.

    Und so ergibt sich folgendes Sammelsurium:

            Dim s1 As String = TestFunc()
            Dim s2 As String = TestFunc()(0)
            ' Geht auch sollte man aber der Klarheit zu liebe vermeiden
            Dim s1bad As String = TestFunc
            Dim s2bad As String = TestFunc(0)
            ' und jetzt ist es ein Zeichen
            Dim c1 = TestFunc()(0)
    
    Gruß Elmar


    Mittwoch, 17. Juli 2013 09:37
    Beantworter

Alle Antworten

  • Stefan,und was hast Du als 2. Funktionsdeklaration, also wenn Du den Pfeil nach unten klickst ?


    Hannes

    If you have got questions about this, just ask.

    In a perfect world,
    users would never enter data in the wrong form,
    files they choose to open would always exist
    and code would never have bugs.

    My Forum Threads

    Mittwoch, 17. Juli 2013 08:35
  • chars(index as Integer) as char

    Mittwoch, 17. Juli 2013 08:43
  • Da du einen String zurückbekommst, kann dieser auch umgedeutet werden als Char-Array. Und in dem Fall wäre in der Klammer der Index des Zeichens zu finden.

    Gibst du also tstfunc() an, ist es einfach dein kompletter Returnwert,

    nimmst du hingegen tstfunc(0), ist es nur das erste Zeichen von eben diesem Stringwert.

    Also eigentlich alles korrekt im VS. ;-)

    Und dass das bei Integer, Double oder Object nicht klappt, ist umgekehrt auch klar.


    LG, Dennis.

    EDI Consultant/Developer

    Ich nutze meistens VB6 und VS2005 bis VS2012

    Bitte die Antworten sowie weitere hilfreiche Beiträge von Mitgliedern markieren. Vielen Dank.

    • Als Antwort vorgeschlagen Heslacher Mittwoch, 17. Juli 2013 08:50
    • Als Antwort markiert Stefan Hoffmann2 Donnerstag, 18. Juli 2013 07:50
    Mittwoch, 17. Juli 2013 08:46
  • wenn ich die funktion ändere zu:

        Private Function tstfunc(d As Double) As Integer
            Return "test" + d.ToString
        End Function

    wird aber nichts mehr vorgeschlagen.

    und bei

        Private Function tstfunc() As Char()
            Return {"a"c, "b"c, "c"c}
        End Function

    auch nicht.

    Schon etwas seltsam.

    Mittwoch, 17. Juli 2013 09:09
  • Hallo,

    nein nicht nur "normal" bei Visual Basics Mehrfach-Verwendung von runden Klammern.

    Zum einen kennhzeichnet () eine Methode (Prozedur/Funktion) ohne Parameter - und ist optional, auch wenn das nicht zur Lesbarkeit beiträgt.

    Zum anderen werden runde Klammen auch für den Zugriff auf indizierte Eigenschaften (Indexer) verwendet - bei String ist das die Chars Eigenschaft.

    Und so ergibt sich folgendes Sammelsurium:

            Dim s1 As String = TestFunc()
            Dim s2 As String = TestFunc()(0)
            ' Geht auch sollte man aber der Klarheit zu liebe vermeiden
            Dim s1bad As String = TestFunc
            Dim s2bad As String = TestFunc(0)
            ' und jetzt ist es ein Zeichen
            Dim c1 = TestFunc()(0)
    
    Gruß Elmar


    Mittwoch, 17. Juli 2013 09:37
    Beantworter
  • Das Problem ist, dass VB es einem versucht einerseits einfach zu machen (und vermeindlich überflüssige Klammern weglässt), andererseits versucht dir zu unterstellen, es erstmal richtig gemacht zu haben. Wenn du also ein testfunc(0) angibst, sieht VB zwar, dass testfunc eigentlich parameterlos ist, aber einen String zurückgibt, der wiederum als Eigenschaft hat, dass man mit einem Index direkt einzelne Zeichen des Strings zugreifen kann. Also gibt es keinen Fehler, obwohl strenggenommen dein Aufruf dann testfunc()(0) heißen müsste, sprich Testfunc ohne Parameter aufrufen, und von diesem String-Wert (zweite Klammer) dann das 0. Zeichen. Siehe auch Elmars Beispiele ...

    Und wie Elmar bereits schrieb, fördert das nicht immer die Lesbarkeit. C# ist da, zum Glück, etwas strenger.

    Da andere Variablentypen diesen Index nicht mitbringen, bekommst du da auch keinen zweiten Vorschlag. Und in deinem Beispiel mit dem CharArray als Rückgabe funktioniert es natürlich auch nicht, da ein CharArray nicht automatisch ein String ist und auch nicht automatisch als solcher behandelt wird. Ein String ist aber immer quasi auch ein CharArray.


    LG, Dennis.

    EDI Consultant/Developer

    Ich nutze meistens VB6 und VS2005 bis VS2012

    Bitte die Antworten sowie weitere hilfreiche Beiträge von Mitgliedern markieren. Vielen Dank.

    Mittwoch, 17. Juli 2013 13:35