פיתוח תוכנה – צעד אחר צעד, עבודה עם Enum ב – #C

7 במאי 2014

תגיות: , , ,
2 תגובות

הרבה פעמים אנחנו רוצים להחזיק משתנה עם ערך מתוך רשימה, לדוגמה – יום בשבוע (ראשון, שני, שלישי וכו’).

כדי לעשות זאת נוכל להגדיר משתנה מסוג string ולהחזיק את השם של היום בשבוע, הבעייה עם שיטה זו, שנוכל בקלות לעשות טעיות כתיב והמידע יהיה לא נכון, שיטה אחרת היא כמובן להחזיק מספר כשנחליט שיום ראשון הוא 1, יום שני הוא 2 וכן הלאה. הבעייה בשיטה זו, היא שהקוד לא קריא, כי אם לדוגמה אנחנו רוצים לעשות בדיקה, הקוד ייראה משהו בסגנון:

Code Snippet
int day = int.Parse(Console.ReadLine());
if (day == 1)
{
    //….
}
else if (day == 2)
{
    //..
}
//….

בדיוק בשביל לפתור את הבעייה הזו, יש לנו enum בשפה,

enum זה למעשה רשימה של שם וערך, כשבכל הקוד שלנו נעבוד עם השמות, בעוד שמאחורי הקלעים המשתנה הוא מסוג int.

ההגדרה והשימוש יהיו כאלו:

Code Snippet
public enum Days
{
    Sunday,
    Monday,
    Tuesday,
    Wednesday,
    Thursday,
    Friday,
    Saturday
}

public class Class1
{
    public Class1()
    {
        Days day1 = Days.Sunday;

        if (day1 == Days.Sunday)
        {

        }
        else if (day1 == Days.Monday)
        {

        }
    }
}

כמובן שהערך שיש ב – day יכול להגיע ממקורות שונים, יש מספר פונקציות בתוך Enum, לדוגמה המרה של ערך שמתקבל מה – Console לאובייקט מסוג enum, יהיה כזה:

 

Code Snippet
Days day2;
if (Enum.TryParse(Console.ReadLine(), out day2))
{
    if (day2 == Days.Sunday)
    {

    }
    else if (day2 == Days.Monday)
    {

    }
}

 

אחד הטריקים הנחמדים שיש לעבודה עם enum, הוא היכולת שלנו לכתובת switch ואז ללחוץ על מקש ה – tab, לאחר מכן לכתוב את שם המשתנה (בדוגמה שלנו day2) ופעמיים אנטר, מה שנקבל זה בדיקה על כל האופציות שיש ב – enum.

Code Snippet
switch (day2)
{
    case Days.Sunday:
        break;
    case Days.Monday:
        break;
    case Days.Tuesday:
        break;
    case Days.Wednesday:
        break;
    case Days.Thursday:
        break;
    case Days.Friday:
        break;
    case Days.Saturday:
        break;
    default:
        break;
}

 

לפעמים נרצה שהערך שיש ב – day2 יכיל יותר מיום אחד, לדוגמא אם נרצה לקבוע פגישה ביום שני וביום חמישי, לא נרצה להחזיק שני משתנים.

הדרך לעשות זאת היא בעזרת הגדרה של ה – enum כ – flag, למעשה לכל ערך ב – enum יש מספר החל מ – 0, הבעייה כמובן שבמידה ונבחר גם את שני וגם את חמישי הערך אמור להיות 5 (1 של יום שני ו – 4 של יום חמישי) אבל ייתכן שהערך 5 מייצג גם את יום שישי, או אולי את יום שלישי ויום רביעי, וכן הלאה.

אבל במידה וניתן ערך ידנית לכל אחד מהערכים ערך מספרי עולה בחזקת 2, כך:

Code Snippet
public enum Days
{
    Sunday = 1,
    Monday = 2,
    Tuesday = 4,
    Wednesday = 8,
    Thursday = 16,
    Friday = 32,
    Saturday = 64
}

לא ייתכן מצב שבו חיבור של מספר כלשהו – ייתן יותר מערך אחד בו זמנית.

בדרך כלל נשים מעל ה – enum את ה – attribute flag.

Code Snippet
[Flags]
public enum Days

 

כעת נוכל להגדיר שהערך של day2 יהיה גם יום שני וגם יום חמישי, כך:

Code Snippet
Days day2 = Days.Monday | Days.Tuesday;

זהו אופרטור בינארי – ולא ניכנס כרגע כיצד זה עובד.

הבעייה היחידה שנשארה לנו, היא כיצד בודקים את הערך של day2, בשונה מ – enum רגיל, אי אפשר לשאול האם זה שווה לערך כלשהו, כי ייתכן שזה למעשה מכיל גם אותו, ולכן יש לנו פונקציות מיוחדות.

Code Snippet
if (day2.HasFlag(Days.Tuesday))
{
}

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

הוסף תגובה
facebook linkedin twitter email

כתיבת תגובה

האימייל לא יוצג באתר. שדות החובה מסומנים *

2 תגובות

  1. Pingback: עבודה עם enum flag + angular | שלמה גולדברג (הרב דוטנט) - net.rabbi@gmail.com

  2. יוסי14 ביולי 2016 ב 8:50

    יפה מאוד!!!! מובן וממש מעניין

    הגב