Eingenschafts-setter nur auf Intger eingrenzen mit Regex

  • C#
  • .NET (FX) 4.5–4.8

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von Takafusa.

    Eingenschafts-setter nur auf Intger eingrenzen mit Regex

    Moin,

    ich möchte gerne eine Eigenschaft erstellen, die nur Integer akzeptiert.
    Bin dabei auf Regex gestoßen und habe schon ein wenig Code erstellt, jedoch klappt es noch nicht ganz.
    Kann da Jemand evtl. Hinweise / Verbesserungsvorschläge geben?
    Danke


    C#-Quellcode

    1. class Logik
    2. {
    3. private int _spieleranzahl;
    4. private System.Text.RegularExpressions.Regex Reg = new System.Text.RegularExpressions.Regex("[0-9]");
    5. public int Spieleranzahl
    6. {
    7. get { return _spieleranzahl; }
    8. set
    9. {
    10. if(value = Reg)
    11. {
    12. _spieleranzahl = value;
    13. }
    14. else
    15. {
    16. Console.WriteLine("Bitte Geben Sie eine Zahl an.");
    17. }
    18. }
    19. }
    20. }
    In deiner Property ist jeder Wert, der ​Spieleranzahl zugewiesen werden kann (also jeder Wert, der im Setter in ​value ankommt), schon ein ​int - da musst du nichts weiter checken. Wenn es darum geht, einen String aus dem Konsoleninput zu interpretieren, würde ich statt Regex einfach ​int.TryParse() empfehlen - das gibt dir direkt ​false zurück, wenn die Zahl kein Integer ist, ohne dass du zu so komplexen Tools wie Regex greifen musst.
    @nafets Jou.
    @Visual_Prog In Deinem Fall genügt

    C#-Quellcode

    1. class Logik
    2. {
    3. public int Spieleranzahl { get; set; }
    4. }
    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!
    Okey also dass die Eigenschaft an sich nur Integer zulässt ist klargeworden.

    Es geht tatsächlich darum einen Konsoleninput zu interpretieren.
    Habe dazu schon eine Funktion gebastelt, würde das aber gerne als Eigenschaft erstellen. Hat da Jemand Vorschläge?
    Danke

    C#-Quellcode

    1. static void Einleitung()
    2. {
    3. // spieleranzahl
    4. Console.WriteLine("Geben Sie die Spieleranzahl an: ");
    5. logo._eingabe = Console.ReadLine();
    6. logo._isdieumwandlungja = Int32.TryParse(logo._eingabe, out logo._ziffer);
    7. if (logo._isdieumwandlungja == true)
    8. {
    9. Console.WriteLine("Die Eingabe war erfolgreich.");
    10. }
    11. else if (logo._isdieumwandlungja == false)
    12. {
    13. Console.WriteLine("Bitte geben Sie eine Zahl ein.");
    14. }
    15. }


    logo ist eine Instanz der Klasse Logik, die ein wenig die Logik regulieren soll :)
    @Visual_Prog Welche Möglichkeiten eines Boolean außer True und False gibt es denn noch?
    Machst Du

    C#-Quellcode

    1. if (logo._isdieumwandlungja)
    2. {
    3. Console.WriteLine("Die Eingabe war erfolgreich.");
    4. }
    5. else
    6. {
    7. Console.WriteLine("Bitte geben Sie eine Zahl ein.");
    8. }
    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!
    nochmal eine frage zur Eigenschaft:

    Mein Ziel ist ja dass die setter-Funktion die Eingabe in der Konsole reguliert.

    Habe das jetzt mal so geschrieben:

    C#-Quellcode

    1. public class Logik
    2. {
    3. private int _ziffer;
    4. private string _eingabe;
    5. private bool _isdieumwandlungja;
    6. public int Ziffer
    7. {
    8. get
    9. {
    10. return _ziffer;
    11. }
    12. set
    13. {
    14. Console.WriteLine("Geben Sie die Spieleranzahl an: ");
    15. _eingabe = Console.ReadLine();
    16. _isdieumwandlungja = Int32.TryParse(_eingabe, out _ziffer);
    17. if (_isdieumwandlungja)
    18. {
    19. Console.WriteLine("Die Eingabe war erfolgreich.");
    20. _ziffer = value;
    21. }
    22. else
    23. {
    24. Console.WriteLine("Bitte geben Sie eine Zahl ein.");
    25. }
    26. }



    Wenn ich aber später die Eigenschaft Aufrufe in der static void Main(string[] args), kann ich der Eigenschaft nichts zuweisen.

    es steht dan logo.Ziffer = wie könnte ich dieses Problemchen denn am besten lösen.
    You made my day.
    Lustig, weil das ergibt keinen Sinn! Alles im Setter wird erst nach dem Zuweisen des Wertes ausgeführt. So müsstest du einen Wert zuweisen, damit ein neuer im Setter versucht wird zu ermitteln. Erklär mir bitte den Sinn dafür.

    Alternative:

    C#-Quellcode

    1. class Program
    2. {
    3. class Logik
    4. {
    5. int ziffer = 0;
    6. public int Ziffer
    7. {
    8. get => ziffer;
    9. }
    10. public bool SetzeZiffer(string input)
    11. {
    12. int tmp = 0;
    13. if(int.TryParse(input, out tmp))
    14. {
    15. ziffer = tmp;
    16. return true;
    17. }
    18. return false;
    19. }
    20. }
    21. static Logik l = new Logik();
    22. static void Main(string[] args)
    23. {
    24. Console.WriteLine("Type in the input...");
    25. Console.WriteLine(l.SetzeZiffer(Console.ReadLine()));
    26. Console.WriteLine(l.Ziffer);
    27. Console.WriteLine("Press any key to exit");
    28. Console.ReadKey();
    29. }
    30. }

    Visual_Prog schrieb:

    wo so nett mit dem Setter umgegangen wird und die Werte reguliert werden


    Regulieren ergibt ja Sinn, kommt vor das der Wert z.B. in einem bestimmten Bereich sein muss, ist der ausserhalb -> Fehlermeldung. Aber einen Wert zuweisen, damit der Setter durchläuft um einen ganz anderen zu ermitteln, hast du ja erkannt, das es wenig/keinen Sinn hat, auch unlogisch ist. Da ja ein string geparst werden muss, macht es noch weniger Sinn, das dies u.U. nicht klappt.

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