marcoborn
Goto Top

Rückgabewerte von Funktionen

Hallo Forum,
ich schreibe gerade in VB.NET eine Funktion, die als Rückgabewert einen Double-Wert zurückliefert. Wenn jedoch vom Nutzer unzulässige Werte übergeben werden, kann dieser Wert nicht berechnet werden. Ich würde dann gern eine Fehlermeldung zurückliefern. Ist es in VB.NET machbar, als Rückgabeformat Double und String parallel zu definieren? Wenn ja, wie mache ich das am besten?

Vielen Dank im voraus,
M. Born

Content-ID: 266466

Url: https://administrator.de/contentid/266466

Ausgedruckt am: 21.11.2024 um 21:11 Uhr

114757
114757 16.03.2015 aktualisiert um 14:35:26 Uhr
Goto Top
Moin,
überprüfe bevor du die die Eingaben an die Funktion übergibst die Eingaben des Users auf Gültigkeit, z.B. mit isNumeric()!
Man kann aus deiner Funktion nur einen Wert des Typs double zurückgeben. Da müsstest du schon den Datentyp ändern, z.B auf eine Collection oder ähnliches in der du einen Vermerk darauf setzt.

Alternativ kannst du natürlich auch eine Exception aus deiner Funktion werfen, welche du mit einem Try-Catch außerhalb der Funktion abfängst.

Gruß jodel32
SlainteMhath
SlainteMhath 16.03.2015 aktualisiert um 14:31:03 Uhr
Goto Top
Moin,

um das zu realisieren gibt's 2 Möglichkeiten:

1. Du gibst eine Datenstruktur (eine Klasse) zurück, mit einem String (für evtl. Fehlermeldungen) und einem Double
2. Du löst im Fehlerfall in der Funktion per "Throw" eine Exception aus die vom aufrufenden Code per Try..:Catch entsprechend behandelt wird

überprüfe bevor du die die Eingaben an die Funktion übergibst
Naja, das will man aber nicht jedesmal machen,wenn dan die Func aufruft, oder? face-smile


lg,
Slainte
MarcoBorn
MarcoBorn 16.03.2015 um 14:38:05 Uhr
Goto Top
Hallo Jodel,
die Funktion soll später durch die Anwender selbst aufgerufen werden. Ob und wie dort eine Fehlerbehandlung erfolgt, kann ich nicht beeinflussen. Daher will (bzw. muss) ich direkt in der Funktion die Eingangsparameter auf Gültigkeit prüfen. Ich denke, der Weg mit der Exception ist der Sinnvollste. Dafür sind die Dinger ja entwickelt worden.

Vielen Dank,
M. Born
MarcoBorn
MarcoBorn 16.03.2015 um 14:39:38 Uhr
Goto Top
Hallo Slainte,
ich werde versuchen, den Weg mit der Exception zu lösen. Danke für die Hilfe.

M. Born
mayho33
mayho33 20.04.2015 um 11:11:37 Uhr
Goto Top
Du könntest dein Funktion überladen und so 2 Rückgabe Typen angeben. der Benutzer deiner Funktion darf sich dann aber nicht auf einem bestimmten Rückgabe Typ festlegen, was selten der Fall ist. Im Fehlerfall würde ich einfach NULL zurückgeben.
MarcoBorn
MarcoBorn 23.04.2015 um 20:03:01 Uhr
Goto Top
Das ist ja genau das, was ich will. Z.B. einen String im Erfolgsfall und Nothing bei einem Fehler. Wie geht das mit der Überladung?
colinardo
colinardo 23.04.2015 aktualisiert um 20:54:10 Uhr
Goto Top
Hallo Marco,
Zitat von @MarcoBorn:
Das ist ja genau das, was ich will. Z.B. einen String im Erfolgsfall und Nothing bei einem Fehler.
dann machs doch einfach mit Object als Rückgabetyp face-wink da bist du flexibel, was den Rückgabewert betrifft.

Ein Beispiel
Public Class Form1

    Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
        Dim result As Object = DemoFunktion("xxx")  
        If result = Nothing Then
            MsgBox("Kreiiiiiiiischhhhh")  
        Else
            MsgBox(result)
        End If
    End Sub

    Public Function DemoFunktion(parameter1 As String) As Object
        Try
            If parameter1 = "Hallo" Then  
                Return "Den String gebe ich zurück"  
            Else
                Return Nothing
            End If
        Catch ex As Exception
            Return Nothing
        End Try
    End Function

End Class

Zum Overloading:
https://support.microsoft.com/en-us/kb/311330
Denke aber nicht das das für deinen Fall passend ist.

Grüße Uwe
MarcoBorn
MarcoBorn 28.04.2015 um 10:09:25 Uhr
Goto Top
Hallo Uwe,
Object als Datentyp ginge natürlich immer, aber dadurch wird das Programm natürlich langsamer und fehleranfälliger, weill immer die Rückgabewerte auf den richtigen Datentyp geprüft werden müssen. Die Standard-Funktionen von .NET liefern ja auch z.B. einen Integer-Wert zurück oder ein Nothing, wenn ein Fehler aufgetreten ist. Ich werde mal sehen, ob ich das mit dem Overloading hinbekomme. Das scheint genau das zu sein, was ich brauche...

Viele Grüße,
Marco
mayho33
mayho33 29.04.2015 um 19:30:53 Uhr
Goto Top
Hi Born!

Ich habe vor kurzem was ähnliches gebraucht in textBoxes bzw. ComboBoxes. Da lasse ich z.B. direkt bei der Eingabe nur bestimmte Sachen zu. Schau es dir doch einfach mal an ob es für dich brauchbar ist

internal static class TextControl
    {
        internal static void TextBox_AllowOnlyNumbers(TextBox textbox, object sender)
        {
            var t = (sender as TextBox).Text.ToCharArray();
            int val;
            if (t.Length > 0)
            {
                int CharLenght = Convert.ToInt32(t[t.Count() - 1]);

                if (!int.TryParse(t[t.Count() - 1].ToString(), out val))
                {
                    textbox.Text = textbox.Text.Substring(0, textbox.Text.Length - 1);
                    textbox.SelectionStart = textbox.Text.Length;
                }
            }
        }


        internal static void TextBox_ExcludeSpecificCharacters(TextBox textbox, object sender, string toExclude)
        {
            foreach (var item in toExclude)
            {
                var t = (sender as TextBox).Text.ToCharArray();
                if (t.Length > 0)
                {
                    int CharLenght = Convert.ToInt32(t[t.Count() - 1]);

                    if (t[t.Count() - 1].ToString() == item)
                    {
                        textbox.Text = textbox.Text.Substring(0, textbox.Text.Length - 1);
                        textbox.SelectionStart = textbox.Text.Length;
                    }
                }
            }

        }


        internal static void ComboBox_AllowOnlyNumbers(ComboBox combobox, object sender)
        {
            var t = (sender as ComboBox).Text.ToCharArray();
            if (t.Length > 0)
            {
                int val;
                int CharLenght = Convert.ToInt32(t[t.Count() - 1]);

                if (!int.TryParse(t[t.Count() - 1].ToString(), out val))
                {
                    combobox.Text = combobox.Text.ToString().Substring(0, combobox.Text.ToString().Length - 1);
                    combobox.SelectionStart = combobox.Text.Length + 1;
                }
                else
                {
                    combobox.SelectionStart = combobox.Text.Length + 1;
                }
            }

        }

        internal static void ComboBox_ExcludeSpecificCharacters(ComboBox combobox, object sender, string toExclude)
        {
            foreach (var item in toExclude)
            {
                var t = (sender as ComboBox).Text.ToCharArray();
                if (t.Length > 0)
                {
                    int CharLenght = Convert.ToInt32(t[t.Count() - 1]);

                    if (t[t.Count() - 1].ToString() == item)
                    {
                        combobox.Text = combobox.Text.ToString().Substring(0, combobox.Text.ToString().Length - 1);
                        combobox.SelectionStart = combobox.Text.Length + 1;
                    }
                    else
                    {
                        combobox.SelectionStart = combobox.Text.Length + 1;
                    }
                }
            }
        }
    }