Optional

  • VB.NET

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

    Hi
    da gehen glaub' ich nur konstante Ausdrücke. Point ist kein konstanter Aufruf, da der Konstruktor von Point aufgerufen wird. Erledige das sauber per Überladung, Optional verwendet man eigentlich nie. Wird afaik auch nur in Microsoft.VisualBasic verwendet.

    z.B. so:

    VB.NET-Quellcode

    1. Public Sub H()
    2. H(New Point(300, 180))
    3. End Sub
    4. Public Sub H(ByVal position As Point)
    5. Stop
    6. End Sub


    Gruß
    ~blaze~

    Investmentclub schrieb:

    Dann nutze ich lieber diese Version:

    Also das mit der Überladung ist dann aber schon ... "schöner" ...

    Gibt noch mehr Möglichkeiten (Überladung immer noch schöner!)

    VB.NET-Quellcode

    1. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    2. Dim p As New Point
    3. p.X = 0
    4. p.Y = 0
    5. foo()
    6. bar(p)
    7. bar()
    8. End Sub
    9. Private Sub foo(Optional ByVal p As Point = Nothing)
    10. If p.IsEmpty Then
    11. p.X = 1
    12. p.Y = 2
    13. End If
    14. End Sub
    15. Private Sub bar(Optional ByVal p As Nullable(Of Point) = Nothing)
    16. If p Is Nothing Then
    17. p = New Point(1, 2)
    18. End If
    19. ' muss man halt mit p.value arbeiten
    20. End Sub

    Foo hat dann den Nachteil, dass 0,0 halt "kein" Point ist (weil nothing=default und default=0,0)
    Bar hat den Nachteil dass man halt zusätzlich den Point in Nullable(of Point) konvertiert
    Es ist halt fraglich, was für einen Sinn Optional überhaupt hat. Ich meine, es wird ja praktisch auf Basis des Compilers ausgewertet, ob der übergebene Ausdruck oder ein konstanter Ausdruck genommen werden soll. Das Erste ist unschön und das mit dem Nullable ist zwar ein Workaround, aber auch eher zweckmäßig. Die einzige elegante Lösung ist mMn die Überladung, da Optional sowieso VB-Only ist und sonst eh nichts zu suchen hat.
    Welchen Vorteil siehst du denn in Optional?

    Gruß
    ~blaze~

    ~blaze~ schrieb:

    da Optional sowieso VB-Only

    BLAAAAAZZZZE AUUUUUUFWAAAAAACHEN, es ist schon nach FW 2.0! :D

    Quellcode

    1. public Form1()
    2. {
    3. InitializeComponent();
    4. Foo();
    5. }
    6. private void Foo(int i = -1)
    7. {
    8. }


    C# hat optionale Parameter in C# 4.0 bekommen. Grund: Die C#'ler wollten auch so ein Feature haben, wie es die VB'ler hatten! Coevolution!
    Welchen Vorteil siehst du denn in Optional?
    Bei vielen Überladungen spart man sich etwas Schreibarbeit, wenn man mit Optional kombinieren kann.

    VB.NET-Quellcode

    1. Sub foo(bar As String, Optional isValid as Boolean = False)
    2. Sub foo(bar As Long, Optional isValid as Boolean = False)
    3. Sub foo(bar As anObject, Optional isValid as Boolean = False)
    4. Sub foo(bar As anotherObject, Optional isValid as Boolean = False)
    5. Sub foo(bar As anObject, bar2 as anotherObject, Optional isValid as Boolean = False)
    Sind nur 5 Definitionen, während du ohne Optional 10 Definitionen hättest.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Ok, ich geb's zu, ich bin einfach veraltet (auf den Index mit dem FW!!). Wird vielleicht echt mal Zeit... :rolleyes:
    Bei sowas mach ich grundsätzlich C&P, weil dass man da etwas vergisst, passiert eh selten. Naja, vllt. bin ich einfach etwas festgefahren in dem alten Zeug, aber mir kommt's einfach unsauber vor.

    Gruß
    ~blaze~
    Unsauber hin oder her. Es geht schneller als ne Überladung ist aber vll. nen klein wenig unsauberer. Eigentlich egal wobei man schon auf keinen Fall alle Überladungen durch optionale paramter ersetzen sollte.


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.
    optional find ich persönlich nicht schlecht, da man sich nicht zwingend an deren Signatur halten muss

    VB.NET-Quellcode

    1. Sub Main()
    2. Debug.Print(blubb(1, Text:="TEST", Zeichen:="B"c, Zahl2:=3.4, Flag:=False))
    3. End Sub
    4. Private Function blubb(ByVal Zahl As Integer, Optional ByVal Flag As Boolean = True, Optional ByVal Text As String = "", Optional ByVal Zahl2 As Double = 1.2, Optional ByVal Zeichen As Char = "A"c) As String
    5. Return ""
    6. End Function


    EDIT: Soll heißen wenn man 3 optionale hat, man nur diesen einen anhand := angeben muss und nicht alle vorangestellten.

    lg
    ScheduleLib 0.0.1.0
    Kleine Lib zum Anlaufen von Code zu bestimmten Zeiten

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

    ich halte optionale Parameter für das Überladungen vorzuziehende Code-Design.
    Häufig sind Überladungen ja so gestrickt, dass die Überladung mit wenigen Parametern nix tut als die Nachbar-Überladung mit mehr Parametern aufzurufen, wobei vorgegebene zusätzliche Parameter verwendet werden.

    Als Progger siehste die zusätzlichen Parameter aber nicht inne Intellisense, sondern bestenfalls kannstese in der Doku nachlesen, wenn ordentlich dokumentiert ist.

    Hingegen bei optionalen Parameter gibts die Überladung mit den wenigen Parametern garnet (das macht Code schonmal übersichtlicher), und was vorher ein unsichtbarer zusätzlicher Parameter war ist nun ein offensichtlicher, optionaler Parameter.

    Weiterer Vorteil ist, dass die Optionalität ühaupt angezeigt ist inne Intellisense. ZB. die meisten Leuts wissen doch nichtmal, dass man bei String.Split() auch StringsplitOptions angeben kann!
    Einfach weil sie nur die erste Überladung nehmen die kommt, und die macht keine StringSplitOptions sichtbar.

    Aber es gibt halt auch viele Fälle, wo optionale Parameter nicht anwendbar sind, allein schon wenn die gewünschten Default-Werte nicht konstant sein können.

    Investmentclub schrieb:

    bekommen ich nicht gleich 20 Fehler, sondern nur 20 falsche Ergebnisse.
    Dann haste aber sehr viel Code grützig geschrieben. :S
    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!

    ErfinderDesRades schrieb:

    Als Progger siehste die zusätzlichen Parameter aber nicht inne Intellisense, sondern bestenfalls kannstese in der Doku nachlesen, wenn ordentlich dokumentiert ist.

    wat? welches intellisense nutzt du denn?
    aber siehst du auch die Parameter, die implizit gesetzt werden, wenn man eine Überladung mit wenigen Parametern wählt?
    Nein - ist ja Quatsch.
    Wenn du die String.Split-Überladung mit nur einem Parameter wählst, kannst du logischerweise nicht sehen, welcher StringSplitOptions-Wert intern angewendet wird - ja du weißt u.U. garnet, dasses die StringSplitOptions-Enumeration ühaupt gibt.