C# פונקציה לטיפול ב enum המוגדר כ flags ?
-
הביטוי:
משתנה לבדיקה & אפשרות קיימת, מחזיר אפס במידה והאפשרות לא במשתנה.var varOption = Options.A | Options.B; //מכיל A+B if((varOption & Options.A) != 0) //חיובי Console.WriteLine("A"); if ((varOption & Options.B) != 0) //חיובי Console.WriteLine("B"); varOption |= Options.C; //מוסיף את C var varOptionWithoutA = (varOption & ~Options.A); //יוצר משתנה עותק אבל ללא A
כפי שרחמים אמר אפשר להשתמש בHasFlag, רק שבכל מקרה תזדקק לאופרטורים אז אתה יכול לשכוח את המתודה הזאת שנשבת גם לפחות יעילה (אם כי יותר קריאה, אולי תעשה פונקציה נפרדת בשביל הקריאות).
כמו"כ יפה אמר רחמים שהאטריביוט Flags לא מחוייב (השפעתו היא רק על הToString, במקום שיהיה רשום ערך של הראשון מופיע כל הערכים כטקסט).פורסם במקור בפורום CODE613 ב01/07/2016 10:56 (+03:00)
-
סליחה על הבורות, אפשר הסבר פשוט מהו flags?
דגלים.
כלומר לא או זה או זה, אלא כל אפשרות כן/לא.
נגיד למתודה MessageBox.Show יש פרמטר (שישי) בשם options שמקבל טיפוס של Enum בשם MessageBoxOptions
הוא נראה ככה:public enum MessageBoxOptions { ServiceNotification = 0x00200000, DefaultDesktopOnly = 0x00020000, RightAlign = 0x00080000, RtlReading = 0x00100000, }
עכשיו זה אפשרויות שלא מוכרח שתבחר רק אחת מהם, כל אחת היא שיקול בפני עצמה. אז מה עושים אם רוצים גם וגם? זה הרעיון של flag. זה לדחוס במשתנה מספרי אחד כמה וכמה אפשרויות. כי הרי משתנה מספרי עשוי בזיכרון המחשב מכמה וכמה סיביות של כן ולא, הראשונה מייצגת 1, השניה 2, וכן הלאה בחזקת 2.
ממילא אפשר להקצות לכל אפשרות סיבית. המחשב אלוף בפעולות על סיביות, מאחורי הקלעים זה מה שהוא עושה כל היום.
במידה ורוצים לתת שתי אפשרויות לתוך משתנה אחד, אומרים למחשב "הדלק את הסיביות המתאימות לאפשרות זו, וגם את המתאימות לאפשרות זו"
נניח אפשרות א, 1 זה נראה במחשב ככה: 00000000001 אפשרות שמינית זה נניח 128 וזה נראה ככה: 000100000000.
אז להדליק את הסיביות של שתי האפשרויות יוצא 000100000001.
כמובן צריך לתת לערכי הEnum כאלה מספרים שלא תהיה להם דו משמעות בסיביות.הדרך בה מדליקים את שתי הצדדים זה ע"י האופרטור או:
1 | 128 = 129לכן במתודה MessageBox.Show אפשר להעמיס כמה אפשרויות, ככה:
MessageBox.Show("","", MessageBoxButton.OK, MessageBoxImage.Asterisk, MessageBoxResult.No, MessageBoxOptions.DefaultDesktopOnly | MessageBoxOptions.RightAlign)
ויעויין עוד:
http://code.613m.org/viewtopic.php?f=1&t=762&p=4617
http://code.613m.org/viewtopic.php?f=1&t=121#p662פורסם במקור בפורום CODE613 ב04/07/2016 00:21 (+03:00)
-
זה טוב לך?
בחיפוש זה עלה לי בתוצאה הראשונה אבל לא הצלחתי להבין מה הוא עושה שם
אולי יש לי חסר בידע בסיסי בעניין
אנסה להסביר מה ידוע לי ומה אני צריך ורוצה לעשות אולי זה יעזור לעזור לילדוגמה יצרתי enum של ימים כך
public enum Days { Sunday = 1, Monday = 2, Tuesday = 4, Wednesday = 8, Thursday = 16, Friday = 32, Saturday = 64 };
יש לי פונקציה שלדוגמה מקבלת ימים שבהם נקבע פגישה עם ....
לפעמים נקבע פגישה רק יום אחד באותו שבוע ולפעמים כמה ימים באותו שבוע,
הנה הפניות לפונקציהdailyPlanner(Days.Monday | Days.Monday | Days.Sunday); dailyPlanner(Days.Sunday);
וכאן יש לי שתי שאלות
אחת האם הדרך היחידה לקבל את זה בפונקציה הוא כ enum או שאפשרי כמספר?
ולשאלה העיקרית אני רוצה לבנות את גוף הפונקציה dailyPlanner שמקבלת את ה enum
איך אני בודק מה התקבל בפונקציה? האם Sunday לבד או גם Monday וכו'...
תודה על העזרהפורסם במקור בפורום CODE613 ב04/07/2016 23:20 (+03:00)
-
למה לך להסתבך עם ENUM?
במקום כך:dailyPlanner(Days.Monday | Days.Monday | Days.Sunday); dailyPlanner(Days.Sunday);
תכתב כך:
dailyPlanner(Days.Monday, Days.Monday, Days.Sunday); dailyPlanner(Days.Sunday);
וגוף הפונקציה יראה כך:
private static void dailyPlanner(params Days[] days) { // ... }
כך תוכל לקבל את הימים כמערך ולא תצטרך לחלץ אותם מתוך ערך בודד.
פורסם במקור בפורום CODE613 ב05/07/2016 07:50 (+03:00)
-
אבל רחמים, זה בשביל לחסוך לו להבין אותנו? או לחסוך לך להסביר?
גם אם הקוד שלך היה חוסך הוא לא במקומו כשהבן אדם אומר לא הבנתי איך עושים אתה אומר תמשיך לא להבין, העיקר הבעיה שלך סודרה...
ושנית הוא לא טוב: א. הוא מאפשר לשלוח ללא אף יום ב. הרי הימים לא נבחרים ע"י המתכנת בזמן עיצוב... וע"י קלט המשתמש אתה צריך להוסיף את הימים שנבחרו - יצירת List - אז מה הועלנו עם הparams... בEnum אתה חוסך לבדוק כפילויות אבל זה לא כ"כ הפואנטה.zvi good תמה אני מה לא הבנת בתשובות הכה מפורטות שלנו... ומה בוער לך לקבל כמספר ולא כEnum (אכן, אתה יכול! אבל למה)...
פורסם במקור בפורום CODE613 ב05/07/2016 10:58 (+03:00)
-
לדעתי הפתרון הזה יותר טוב מאשר ENUM, כי מן הסתם הוא מקבל את הימים הנבחרים מהמשתמש שבחר ימים בתוך ליסט-בוס, והכי קל זה להעביר לפוקנציה dailyPlanner את רשימת הנבחרים בליסט-בוס הנ"ל כרשימה או מערך, מאשר להמיר את כולם לערך ENUM.
אבל אם הוא עובד עם דטה-ביס ורוצה לשמור את הימים שנבחרו, אז בהחלט עדיף לשמור כENUM שהוא ערך בודד שמכיל הרבה ערכים מאשר לשמור רשימה בתוך המסד נתונים.@דוד ל.ט.
א. הוא מאפשר לשלוח ללא אף יום ב. הרי הימים לא נבחרים ע"י המתכנת בזמן עיצוב... וע"י קלט המשתמש אתה צריך להוסיף את הימים שנבחרו - יצירת List - אז מה הועלנו עם הparams... בEnum אתה חוסך לבדוק כפילויות אבל זה לא כ"כ הפואנטה.
א. אפשר להוסיף שורה כזו:
private static void dailyPlanner(params Days[] days) { if (days == null || days.Length == 0) throw new ArgumentException("days"); // ... }
ב. לא הבנתי "להוסיף את הימים שנבחרו - יצירת List" ? הימים הנבחרים נמצאים במערך שנקרא days אז מה הבעיה?
פורסם במקור בפורום CODE613 ב05/07/2016 11:31 (+03:00)
-
שימוש קלאסי ב Flags הוא במקרה של צורך בהעברת אוסף של הגדרות True\False שלא תלויות זו בזו לפונקציה מסוימת
כמו ב MessageBox לדוגמה, מה יהיה האייקון והאם ייושר לימין וכו', זה קריא, פשוט וחסכוני.
ל Enum שלא מוגדר כ Flags יש עוד שימושים כמו הגבלת קלט לפונקציה.הגישה של למה להסתבך ממש מעצבנת אותי, מתכנת צריך לשאוף להכיר כל אבן מאבני הבנין של התכנות על בוריה, ואחר כך מתוך עמדה של ידע להחליט במה להשתמש ובמה לא.
פורסם במקור בפורום CODE613 ב05/07/2016 11:55 (+03:00)
-
הגישה של למה להסתבך ממש מעצבנת אותי, מתכנת צריך לשאוף להכיר כל אבן מאבני הבנין של התכנות על בוריה, ואחר כך מתוך עמדה של ידע להחליט במה להשתמש ובמה לא.
הבטחתי בלי נדר שאני לא מעלה את הנושא של דת ומדינה כדי לראות האם אני תמיד אשם בויכוחים הללו, והנה זה הגיע :lol: :lol: :lol:
כבר כתבו גדולי המדינאים אפלטון וגם מקיאוולי שמדינה שאין בה דת תקרוס מעצמה.
פורסם במקור בפורום CODE613 ב05/07/2016 13:34 (+03:00)
-
@דוד ל.ט.
רחמים, פתח אשכול חדש.עם איזה נושא?
בנושא: "פונקציה שמקבלת כמה ערכי Enum, לדעתי עדיף סוג מערך מאשר קומבינציית הערכים יחד".
בהודעה תסביר למה.
זה לא קשור לנושא האשכול: איך משתמשים בEnum, הנושא זה עדיין רלוונטי וממילא עדיף לא לסטות ממנו.פורסם במקור בפורום CODE613 ב05/07/2016 15:03 (+03:00)