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-Key: 266466

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

Printed on: April 24, 2024 at 11:04 o'clock

Mitglied: 114757
114757 Mar 16, 2015 updated at 13:35:26 (UTC)
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
Member: SlainteMhath
SlainteMhath Mar 16, 2015 updated at 13:31:03 (UTC)
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
Member: MarcoBorn
MarcoBorn Mar 16, 2015 at 13:38:05 (UTC)
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
Member: MarcoBorn
MarcoBorn Mar 16, 2015 at 13:39:38 (UTC)
Goto Top
Hallo Slainte,
ich werde versuchen, den Weg mit der Exception zu lösen. Danke für die Hilfe.

M. Born
Member: mayho33
mayho33 Apr 20, 2015 at 09:11:37 (UTC)
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.
Member: MarcoBorn
MarcoBorn Apr 23, 2015 at 18:03:01 (UTC)
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?
Member: colinardo
colinardo Apr 23, 2015 updated at 18:54:10 (UTC)
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
Member: MarcoBorn
MarcoBorn Apr 28, 2015 at 08:09:25 (UTC)
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
Member: mayho33
mayho33 Apr 29, 2015 at 17:30:53 (UTC)
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;
                    }
                }
            }
        }
    }