Suche "Alternative" für ByRef ParamArray

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

Es gibt 16 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Suche "Alternative" für ByRef ParamArray

    Hallo,
    ich wollte gerade spaßeshalber eine kleine Klasse schreiben, welche unkompliziert gewünschte Einstellungen im Programm speichern und und wieder laden kann (da My.Settings nicht flexibel genug sind)

    Leider scheitert es an einer guten Alternative zu ByRef ParamArray, was ja nicht (mehr) zulässig ist. Vielleicht hat einer ja eine Idee.

    MfG
    Mikro Fahrrad

    VB.NET-Quellcode

    1. Public NotInheritable Class Settings
    2. Private Sub New()
    3. End Sub
    4. Private Shared _Path As String = My.Computer.FileSystem.SpecialDirectories.CurrentUserApplicationData & "\settings.ini"
    5. Public Shared Property Path() As String
    6. Get
    7. Return _Path
    8. End Get
    9. Set(ByVal Value As String)
    10. If My.Computer.FileSystem.FileExists(Value) OrElse My.Computer.FileSystem.DirectoryExists(My.Computer.FileSystem.GetParentPath(Value)) Then
    11. _Path = Value
    12. End If
    13. End Set
    14. End Property
    15. Public Shared Function Save(ByVal ParamArray values() As Object) As Boolean
    16. Try
    17. Dim Write As IO.StreamWriter = New IO.StreamWriter(Path)
    18. For i = 0 To values.Count - 1
    19. Write.WriteLine(values(i).ToString)
    20. Next
    21. Write.Close()
    22. Return True
    23. Catch ex As Exception
    24. Return False
    25. End Try
    26. End Function
    27. Public Shared Function Load(ByRef ParamArray values() As Object) As Boolean
    28. Try
    29. If Not My.Computer.FileSystem.FileExists(Path) Then Return False
    30. Dim Read() As String = IO.File.ReadAllLines(Path)
    31. For i = 0 To values.Count - 1
    32. values(i) = CTypeDynamic(Read(i), values(i).GetType())
    33. Next
    34. Return True
    35. Catch ex As Exception
    36. Return False
    37. End Try
    38. End Function
    39. End Class
    „Was ich gerade mache? Ich reite Hand in Hand mit dem Matthäus-Effekt auf einer Exponentialfunktion.“ ^^
    Wenn ich das so mache erhalte ich den Fehler "Zu viele Argumente für [diese Funktion]".

    Man soll die Funktionen folgendermaßen nutzen können: (Achtung schlechtgecodetes Beispiel:)

    VB.NET-Quellcode

    1. Dim str As String
    2. Dim bol As Boolean
    3. Dim i As Integer
    4. Dim dbl As Double
    5. str = "Streng geheime Botschaft"
    6. bol = True
    7. i = 42
    8. dbl = Math.PI
    9. MySettings.vb.Settings.Save(str, bol, i, dbl)
    10. str = "Müll"
    11. bol = False
    12. i = 10
    13. dbl = 5.7
    14. MySettings.vb.Settings.Load(str, bol, i, dbl)
    „Was ich gerade mache? Ich reite Hand in Hand mit dem Matthäus-Effekt auf einer Exponentialfunktion.“ ^^
    Ja, die Lösung ist mir klar, aber zu umständlich, oder besser: Diese Lösung spart keinen Code im Vergleich zu einer Ansammlung an WriteLine(irgendwas)-Zeilen.

    Ich dachte man könnte es irgendwie über diese Zeilen realisieren:

    VB.NET-Quellcode

    1. MySettings.vb.Settings.Save(str, bol, i, dbl)
    2. '...
    3. MySettings.vb.Settings.Load(str, bol, i, dbl)


    dotdev schrieb:

    Wieso brauchst du die Werte wieder? Es langt eigentlich das ByVal mit ParamArray.


    Man möchte die Programmeinstellungen nunmal zum Programmstart wieder laden ;)
    „Was ich gerade mache? Ich reite Hand in Hand mit dem Matthäus-Effekt auf einer Exponentialfunktion.“ ^^
    Hi
    leg' dir eine eigene Klasse an und serialisiere diese über XmlSerializer oder BinaryFormatter. Schau' dir am besten Beispiele dazu an.
    ByRef wird nur verwendet, wenn das Argument verändert wird, ergo dem angegebenen Parameter ein neuer Wert zugewiesen wird, ähnlich dem Rückgabewert der Funktion.

    Viele Grüße
    ~blaze~
    Danke werde ich mir ansehen.

    Genau deshalb brauche ich ja ByRef, weil die Funktion Load die Werte lesen soll und diese "zurückgeben" soll, d. h. diese in die Variablen im ParamArray reinschreiben soll.

    Edit: @dotdev Schau dir mal den Titel an ;) (wenn es funktionieren würde, gäbe es ja kein Problem)
    „Was ich gerade mache? Ich reite Hand in Hand mit dem Matthäus-Effekt auf einer Exponentialfunktion.“ ^^

    dotdev schrieb:

    Die Funktion sollte die Resultate zurückgeben, das soll nicht durch ByRef passieren.

    Wie soll das mit diesem Aufruf zusammen funktionieren?

    VB.NET-Quellcode

    1. MySettings.vb.Settings.Load(str, bol, i, dbl)


    dotdev schrieb:

    Wenn du das mit ByRef dennoch machen möchtest, dann kommst du um die Lösung nicht herum wie ich es dir zuerst beschrieben habe.

    Was heißt denn Lösung? Es hat nicht funktioniert!
    „Was ich gerade mache? Ich reite Hand in Hand mit dem Matthäus-Effekt auf einer Exponentialfunktion.“ ^^
    Du musst es auch als Liste übergeben.
    Es ist anders, aber es funktioniert. Wie gesagt, ByRef verwendet man dafür nicht, die Funktion sollte statt Bool, einen Liste zurückgeben. Gut so wie ich es im Bsp. habe passiert das mit ByRef.

    dotdev schrieb:

    Du musst es als Array/Listen-Element übergeben.
    Wieso brauchst du die Werte wieder? Es langt eigentlich das ByVal mit ParamArray.

    VB.NET-Quellcode

    1. Dim el As New List(Of Object)
    2. el.Add("Streng geheime Botschaft")
    3. el.Add(True)
    4. el.Add(42)
    5. el.Add(Math.PI)
    6. MySettings.vb.Settings.Save(el)
    7. '....
    Ja, aber ich wollte ja versuchen, es als schlanken Ein- oder Zweizeiler zu schreiben, aber nicht als n-Zeiler (n mal "Add(irgendwas)")
    „Was ich gerade mache? Ich reite Hand in Hand mit dem Matthäus-Effekt auf einer Exponentialfunktion.“ ^^
    So wie Du das vorhast, funktioniert das nicht direkt. Die CLR würde Arrays von Pointern grundsätzlich schon unterstützen, aber in VB und auch C# kann man das nicht direkt verwenden. Viele Parameter an eine Funktion zu übergeben bringt Probleme mit sich:
    Was, wenn Du zuerst Load bzw. Save(A, B, C) hast und dann aber dazwischen was einfügst?: Load bzw. Save(A, X, B, C)

    Serialisierung würde sich doch prima anbieten.

    VB.NET-Quellcode

    1. <Serializable()>
    2. Public Class MeineSettings
    3. Public Property Foo As Bar
    4. '...
    5. End Class

    Das Ganze in einen BinaryFormatter (oder vielleicht doch XmlFormatter) schmeißen und man muss sich um nichts kümmern. Der Vorteil ist, dass man schöne Namen für die einzelnen Eigenschaften hat.

    Wenn Du wirklich was selbergebasteltes willst, kannst Du mal hier rein gucken:
    github.com/Niko-O/OMS/tree/mas…20Overlays/PluginSettings
    github.com/Niko-O/OMS/tree/mas…PluginManagement/Settings
    github.com/Niko-O/OMS/blob/mas…sPlugin/TennisSettings.cs

    Oder auch hier:
    ApplicationSettings v1.2
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils
    Hm, okay danke. Ich dachte mir schon, dass es nicht funktioniert. Mal schauen, was ich für eine Lösung finde / nutze.
    „Was ich gerade mache? Ich reite Hand in Hand mit dem Matthäus-Effekt auf einer Exponentialfunktion.“ ^^
    @Niko Ortner Jou.
    @Mikro Fahrrad Das geht ganz easy. Mach Dir eine entsprechende Klasse die alle Deine Daten anthält und serislisiere sie, binär oder per XML, für letzteres gugst Du hier.
    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!