עבור לתוכן

בעיה קטנה בC#.

Featured Replies

פורסם

יש לי תוכנה שהאופציות בה פועלות לפי Charים.

אבל עם מכניסים קלט ריק (כלומר לReadline פשוט לוחצים אנטר) אז היא קורסת.

איך מתעלמים מקלט ריק כזה?

תודה ;)

פורסם

בעיקרון אתה צריך לבדוק אם הוא ריק לפני שאתה מבצע את הפעולות שאתה רוצה לעשות.

נוכל לעזור לך יותר אם תעלה את הקטע בקוד שלך שעליו אתה מדבר.

פורסם
  • מחבר

הקוד ארוך..הנה דוגמא פשוטה.

int a=int.parse(console.readline());

אם לוחצים אנטר בקטע כזה התוכנה קורסת...איך מונעים את זה?

פורסם

אם אתה רוצה לבדוק רק אם המחרוזת ריקה אתה יכול להשתמש במתודה IsNullOrEmpty שנמצאת ב string:


string input = Console.ReadLine();
int option;
if(!string.IsNullOrEmpty(input))
option = int.Parse(input);

אם אתה רוצה לבדוק באופן כללי אם הקלט הוא מספר חוקי ולא רק אם הוא ריק אתה יכול להשתמש ב TryParse שלא זורקת Exception אלא מחזירה boolean שמציין אם ההמרה הצליחה:


string input = Console.ReadLine();
int option;
if(!int.TryParse(input, out option))
Console.WriteLine("Error: Invalid input");

פורסם

אפשר כמובן גם סתם להשתמש ב-parse, אבל לעטוף אותו ב-try/catch.

פורסם

נכון, אבל זה פחות יעיל כי זריקה ותפיסה של חריגות "יקרה" יותר.

פורסם
  • מחבר

אחלה עובד,תודה ;D

  • 2 שבועות מאוחר יותר...
פורסם

אני יודע שהנושא לא פעיל כבר יותר משבוע אבל רציתי להציע עוד שיטה לבדיקת התקינות של הקלט.

אפשר גם לעשות את זה בצורה הבאה:


try
{
input=int.parse(Console.ReadLine());
}
catch (FormatException)
{
Console.WriteLine("Incorrect input");
}
input=1;
//end try

מה שזה עושה למעשה זה:

ה IDE ינסה להמיר את הקלט ל INT,

אם הוא לא יצליח כי הקלט לא חוקי (אות, רווח או כל דבר אחר שבוא לא מספר) אז הוא יגיד למשתמש שהקלט לא חוקי ויקבע ערך מסוים לקלט

(כמובן שאת הערך הזה אפשר לשנות או לא לשים בכלל ערך)

את ה {}try אפשר לשים תמיד מסביב לקוד שחושבים שהוא בעייתי.

ה catch מתאר אילו פקודות יתבצעו אם הקלט הוא לא חוקי.

פורסם

זה בדיוק מה ששניצל כתב:

אפשר כמובן גם סתם להשתמש ב-parse, אבל לעטוף אותו ב-try/catch.

אבל השיטות האחרות עדיפות. שימוש ב exceptions בשביל לשלוט בזרימת הקוד נחשבת להרגל רע. זריקת exception איטית יחסית ולכן צריך להשתמש בה רק במקרים חריגים באמת (מכאן שמה) ולא להיות "עצלנים" ולהשתמש בהן כשיש אפשרות אחרת.

פורסם

זה בדיוק מה ששניצל כתב:

אבל השיטות האחרות עדיפות. שימוש ב exceptions בשביל לשלוט בזרימת הקוד נחשבת להרגל רע. זריקת exception איטית יחסית ולכן צריך להשתמש בה רק במקרים חריגים באמת (מכאן שמה) ולא להיות "עצלנים" ולהשתמש בהן כשיש אפשרות אחרת.

אני מסכים לגמרי, אבל במקרה הזה (בהנחה שהקלט הוא באמת מהמשתמש, וב- try יש רצף של פעולות שיכולות להיכשל) זה סביר לגמרי להשתמש ב- exceptions, ונותן קוד הרבה יותר ברור.

כשמדובר בתגובה לפעולה של המשתמש, ההבדל בביצועים בין שימוש ב- exception לשיטה ה"קלאסית" זניח לגמרי.

פורסם

צודק, למרות שבמקרה הספציפי הזה יש TryParse כחלופה שלדעתי פשוטה באותה מידה.

פורסם

לדעתי לא מומלץ להשתמש ב-exceptions בשביל flow control.

זה יוצר קוד לא קריא במיוחד, כי אתה לא יודע אם ה-exception שנזרק אמור היה להיזרק, או שזה סימן לשגיאה כלשהי.

בנוסף, זה יכול להפריע לדיבאגרים מסויימים (ב-Visual Studio אפשר לומר לו לעצור על כל exception, אז הוא גם יעצור על זה למרות שאין צורך).

ארכיון

דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.

דיונים חדשים