Warum funktioniert das nicht?
Hallo, warum funktioniert dieser Code nicht?
Kurze Infos:
- Ich nutze Avalonia und daher nicht wundern, wenn das inkorrekter WPF-Code wäre.
- Es soll überprüfen, ob die Inputs nicht null sind oder zwei der Inputs nicht nur Zahlen enthalten (einer der Inputs kann deaktiviert werden).
- Je nach Input soll es entweder einen Fehler auswerfen oder halt hinzufügen.
So, das Problem ist: Das macht es nicht. Es wirft manchmal den Fehler, dass die Inputs nicht voll sind. Das war es aber auch (die Feld enthält nicht nur Nummern wird nicht einmal geworfen) und es fügt es trotzdem zur Liste (App.settings.Sessions.Session) hinzu.
Hier der Code (da gutefrage das nicht mag, ein Github-Link).
1 Antwort
Der Name deiner Methode ist irreführend bzw. sie tut nicht das, was man erwartet. Wenn der Wert confirm nicht null ist, liefert sie false, statt true.
private bool confirmNotNull(string confirm, string errorName)
{
// ...
return confirm == null;
}
Somit ergeben sich diese Ergebnisse im Anwendungsfall:
input (hostname): null
confirmNotNull: hostname == null => true
SaveButtonClick: !(true) == true => false
input (hostname): "abc"
confirmNotNull: hostname == null => false
SaveButtonClick: !(false) == true => true => return
Außerdem gibt deine Methode gegebenenfalls eine MessageBox aus. Es bleibt nicht bei einer Wertprüfung. Da wäre doch so ein Name wie ShowMessageOnError o.ä. bestimmt passender oder eine Trennung (Prüfung innerhalb der Methode, die MessageBox hingegen wird in den if-Rumpf in SaveButtonClick verschoben).
Deine Prüfung setzt des Weiteren voraus, dass die Werte tatsächlich null sind. Ich würde den Fall inkludieren, dass eine Eingabe einfach nur einem leeren String entspricht.
if (!string.IsNullOrEmpty(confirm))
{
return true;
}
// show message box ...
return false;
Alternativ zu IsNullOrEmpty könnte sich auch IsNullOrWhiteSpace eignen.
Bezüglich der confirmInt-Methode: Auch in ihr passiert mehr, als der Name verspricht (erneut gibt es eine Mischung aus View- und Anwendungslogik). Die Schleife mit dem switch-case ist eine unnötig lange Implementation. Die TryParse-Methode scheint dir wohl nicht bekannt zu sein.
if (int.TryParse(confirm, out var _))
{
// number is valid
}
else
{
// number is invalid
}
Zu guter Letzt sind mir noch zwei Stellen in deinem Code aufgefallen, die ich etwas seltsam finde.
1) Die Typangabe object?. Mit dem Fragezeichen markiert man Werttypen als Typen, die auch den Wert null annehmen können. Der Alias object verweist jedoch auf einen Referenztyp (System.Object).
2) Du weist dem Property Text des Query-Typs explizit eine Zahl (queryPort) zu, obwohl ich anhand des Namens erwarten würde, dass das Property Zeichenketten aufnimmt.
Die zwei Punkte zuletzt sind Eigenarten von avalonia die so sein müssen bzw. So gewollte "Feinheiten"
P.s.: hatte nicht gedacht dass noch jemand antwortet deswegen so spät