مفهوم Enum در #C

چهارشنبه 10 تیر 1394

دراین مقاله توضیحات و مثال های بسیاری درباره Enam در #C ارائه شده است . در این مثال ها تمامی موارد بررسی شده اند .

Enum یک مقدار ثابت می باشد . اگر تعدادی مقادیر ثابت مربوط به هم داشته باشیم می توانیم مقادیر ثابت را با استفاده از Enum گروه بندی کنیم . Enum ها ثابت های strongly-typed هستند که موجب خواندن ساده تر دستورات می شوند و همنین دستورات کمتر در معرض خطا قرار می گیرند . هنگامی که مجموعه ای از مقادیر عملکرد مهم و بدون تغییر دارید مفید است . یک شمارنده نوعی داده تعریف شده توسط کاربر می باشد که شامل ثابت های یکپارچه می باشند و هریک از ثابت های یکپارچه یک نام ارائه می دهد . کلمه کلیدی Enum برای تعریف نوع داده شمارش شده استفاده می شود .

Enum یک موضوع بسیار ساده و جالب می باشد . امروزه چیزهای جدیدی از Enum  فرا خواهیم گرفت .

دستورات

enum Enum_Name ( Value1,Value2,Value3,……………………ValueN)

مثال 1


    enum Enum_Name  
    {  
        Sun, Mon, Tue, Wed, Thu, Fri, Sat  
    };  
      
    static void Main(string[] args)  
    {  
        Console.WriteLine(Enum_Name.Sun);  
        Console.WriteLine(Enum_Name.Mon);  
        Console.WriteLine(Enum_Name.Tue);  
        Console.WriteLine(Enum_Name.Wed);  
        Console.WriteLine(Enum_Name.Thu);  
        Console.WriteLine(Enum_Name.Fri);  
        Console.WriteLine(Enum_Name.Sat);  
        Console.WriteLine((int)Enum_Name.Sun);  
        Console.WriteLine((int)Enum_Name.Mon);  
        Console.WriteLine((int)Enum_Name.Tue);  
        Console.WriteLine((int)Enum_Name.Wed);  
        Console.WriteLine((int)Enum_Name.Thu);  
        Console.WriteLine((int)Enum_Name.Fri);  
        Console.WriteLine((int)Enum_Name.Sat);  
        Console.ReadLine();  
    }    

خروجی

این مثال نحوه دسترسی به نام و مقدار Enum را توضیح می دهد .

مثال 2


    enum Enum_Name  
    {  
        Sun, Mon, Tue, Wed = 1000, Thu, Fri, Sat  
    };  
      
    static void Main(string[] args)  
    {  
        Console.WriteLine((int)Enum_Name.Sun);  
        Console.WriteLine((int)Enum_Name.Mon);  
        Console.WriteLine((int)Enum_Name.Tue);  
        Console.WriteLine((int)Enum_Name.Wed);  
        Console.WriteLine((int)Enum_Name.Thu);  
        Console.WriteLine((int)Enum_Name.Fri);  
        Console.WriteLine((int)Enum_Name.Sat);  
        Console.ReadLine();  
    }    

خروجی

این مثال توضیح می دهد که اگر یک مقدار صحیح به متغیر enum اختصاص دهیم متغیر بعدی شامل مقداری خواهد بود که یکی از مقدار قبلی بیشتر است .

مثال 3


    enum Enum_Name  
    {  
        Sun, Mon, Tue, Wed = 20000000000, Thu, Fri, Sat  
    };  
      
    static void Main(string[] args)  
    {  
        Console.WriteLine((int)Enum_Name.Sun);  
        Console.WriteLine((int)Enum_Name.Mon);  
        Console.WriteLine((int)Enum_Name.Tue);  
        Console.WriteLine((int)Enum_Name.Wed);  
        Console.WriteLine((int)Enum_Name.Thu);  
        Console.WriteLine((int)Enum_Name.Fri);  
        Console.WriteLine((int)Enum_Name.Sat);  
        Console.ReadLine();  
    }    

خروجی

این دستور با یک خطا مواجه می شود به این دلیل که در حالت پیش فرض نوع داده enum یک نوع integer است . در مثال قبلی فراتر از محدوده integer داشتیم به همین دلیل خطا رخ داد . برای حذف این خطا نوع داده enum را تغییر ی دهیم .


    enum Enum_Name : long  
    {  
       Sun, Mon, Tue, Wed = 20000000000, Thu, Fri, Sat  
    };  
      
    static void Main(string[] args)  
    {  
       Console.WriteLine((int)Enum_Name.Sun);  
       Console.WriteLine((int)Enum_Name.Mon);  
       Console.WriteLine((int)Enum_Name.Tue);  
       Console.WriteLine((long)Enum_Name.Wed);  
       Console.WriteLine((long)Enum_Name.Thu);  
       Console.WriteLine((long)Enum_Name.Fri);  
       Console.WriteLine((long)Enum_Name.Sat);  
       Console.ReadLine();  
    }   

خروجی

مثال 4


    enum Enum_Name : long  
    {  
        Sun = 25, Mon, Tue = Sun, Wed = Sun, Thu = Sun, Fri = Sun, Sat = Sun  
    };  
      
    static void Main(string[] args)  
    {  
        Console.WriteLine((int)Enum_Name.Sun);  
        Console.WriteLine((int)Enum_Name.Mon);  
        Console.WriteLine((int)Enum_Name.Tue);  
        Console.WriteLine((long)Enum_Name.Wed);  
        Console.WriteLine((long)Enum_Name.Thu);  
        Console.WriteLine((long)Enum_Name.Fri);  
        Console.WriteLine((long)Enum_Name.Sat);  
        Console.ReadLine();  
    }    

خروجی

با استفاده از enum ، می توانیم یک مقدار به متغیر از pre-assigned اختصاص دهیم .

مثال 5


    enum Enum_Name : int  
    {  
        Sun, Mon, Tue, Wed, Thu, Fri, Sat, Sun  
    };  
      
    static void Main(string[] args)  
    {  
        Console.WriteLine((int)Enum_Name.Sun);  
        Console.WriteLine((int)Enum_Name.Mon);  
        Console.WriteLine((int)Enum_Name.Tue);  
        Console.WriteLine((int)Enum_Name.Wed);  
        Console.WriteLine((int)Enum_Name.Thu);  
        Console.WriteLine((int)Enum_Name.Fri);  
        Console.WriteLine((int)Enum_Name.Sat);  
        Console.ReadLine();  
    }    

خروجی

در یک enum نمی توانیم متغیر را بیش از یکبار اعلام کنیم ،هر متغیر باید منحصربه فرد باشد .

مثال 6


    enum Enum_Name  
    {  
        Sun, Mon, Tue, Wed, Thu, Fri, Sat  
    };  
      
    static void Main(string[] args)  
    {  
        String[] Str = Enum_Name.GetNames(typeof(Enum_Name));  
        Array stm = Enum_Name.GetValues(typeof(Enum_Name));  
        foreach (string s in Str)  
            Console.WriteLine(s);  
      
        foreach (int  num in stm)  
            Console.WriteLine(num);  
      
        Console.ReadLine();  
    }    

خروجی

این مثال نحوه دسترسی به نام متغیر ها و مقادیر enum با استفاده از یک حلقه را اراوه می دهد. این روش زمانیکه enum دارای متغیر های زیادی است بسیار مفید می باشد .

مثال 7


    enum Enum_Name  
    {  
       Sun, Mon, Tue, Wed, Thu, Fri, Sat  
    };  
      
    static void Main(string[] args)  
    {  
       Console.WriteLine(Enum_Name.Sun + Enum_Name.Thu);  
       Console.ReadLine();  
    }   

خروجی

#C به انجام عملیات ریاضی در دو عضو enum  همانطور که در برنامه قبلی نشان داده شد اجازه نمی دهد . به منظور انجام این کار نیازمند بازنویسی عملیات ریاضی داریم .


    enum Enum_Name  
    {  
       Sun, Mon, Tue, Wed, Thu, Fri, Sat  
    };  
      
    static void Main(string[] args)  
    {  
       Console.WriteLine(((int)Enum_Name.Mon) + ( (int)Enum_Name.Thu));  
       Console.WriteLine(((int)Enum_Name.Mon) - ((int)Enum_Name.Thu));  
       Console.WriteLine(((int)Enum_Name.Mon) * ((int)Enum_Name.Thu));  
       Console.WriteLine(((int)Enum_Name.Mon) / ((int)Enum_Name.Thu));  
       Console.ReadLine();  
    }   

خروجی

مثال 8


    enum Enum_Name1  
    {  
        Sun, Mon, Tue, Wed, Thu, Fri, Sat  
    };  
      
    enum Enum_Name2  
    {  
        Sun, Mon, Tue, Wed, Thu, Fri, Sat  
    };  
      
    static void Main(string[] args)  
    {  
        if (Enum_Name1.Sun == Enum_Name2.Sun)  
            Console.WriteLine("Both Are Same");  
        else  
            Console.WriteLine("Both Are Not Same");  
        Console.ReadLine();  
    }    

خروجی

این مثال نشان می دهد که نمی توانیم دو متغیر enum را باهم مقایسه کنیم .

مثال 9


    enum Enum_Name  
    {  
       Sun, Mon, Tue, Wed, Thu, Fri, Sat  
    };  
      
    static void Main(string[] args)  
    {  
       Console.WriteLine(Enum_Name.Sun > Enum_Name.Thu);  
       Console.WriteLine(Enum_Name.Sat == Enum_Name.Sat);  
       Console.WriteLine(Enum_Name.Sun < Enum_Name.Thu);  
       Console.ReadLine();  
    }   

خروجی

این مثال نشان می دهد که می توانیم دو متغیر از یک enam یکسان را باهم مقایسه کنیم.

مثال 10


    enum Enum_Name  
    {  
        Sun, Mon, Tue, Wed, Thu, Fri, Sat  
    };  
      
    static void Main(string[] args)  
    {  
      
        Stack<Enum_Name> My_Stack = new Stack<Enum_Name>();  
        My_Stack.Push(Enum_Name.Sun);  
        My_Stack.Push(Enum_Name.Tue);  
        My_Stack.Push(Enum_Name.Thu);  
        My_Stack.Push(Enum_Name.Sat);  
        Enum_Name nam = My_Stack.Pop();  
        Enum_Name nam2 = My_Stack.Pop();  
        Console.WriteLine(nam);  
        Console.WriteLine(nam2);  
      
        Console.ReadLine();  
    }  

خروجی

این مثال نشان می دهد که می توانیم از enum در یک مجموعه NET. استفاده کنیم .

مثال 11


    enum Enum_Name:byte  
    {  
       Sun, Mon=3, Tue, Wed, Thu, Fri, Sat  
    };  
      
    static void Main(string[] args)  
    {  
      
       Console.WriteLine(Enum.GetUnderlyingType(typeof(Enum_Name)));  
       Console.ReadLine();  
    }  

خروجی

از GetUnderlyingType برای تعیین نوع داده enum استفاده می شود .

مثال 12

enum Enum_Name
{
Sun, Mon, Tue, Wed, Thu, Fri, Sat
};


class My_class : Enum_Name
{
public void Call()
{
Console.WriteLine("Enum Can not be inherit ");
}
}
static void Main(string[] args)
{
My_class Obj = new My_class();
Enum_Name Enm = Enum_Name.Mon;

Console.ReadLine();
}

خروجی

یک enum نمی تواند ارث بری کند زیرا enum از نوع Sealed می باشد .

مثال 13

enum Enum_Name
{

Sun, Mon, Tue, Wed, Thu, Fri, Sat ,mon
};

static void Main(string[] args)
{
if (Enum_Name.Mon == Enum_Name.mon)
Console.WriteLine("Enum are Case Insensitive");
else
Console.WriteLine("Enum are Case Sensitive");
Console.ReadLine();
}

خروجی

این مثال نشان می دهد که enum ها حساس به لغت (case sensitive) هستند . در یک enam کلمه "Mon" با  "mon" تقاوت دارد .

مثال 14


    enum Enum_Name:byte  
    {  
       Sun, Mon, Tue, Wed, Thu, Fri, Sat  
    };  
      
    static void Main(string[] args)  
    {  
       Console.WriteLine(Enum.Equals(Enum_Name.Sun,Enum_Name.Mon));  
       Console.WriteLine(Enum.Equals(Enum_Name.Mon, Enum_Name.Mon));  
       Console.WriteLine(Enum.Equals(Enum_Name.Tue, Enum_Name.Mon));  
      
       Console.ReadLine();  
    }   

خروجی

“Equals” مشخص می کند که آیا دو شی از یک enum خاص باهم برابر هستند یا خیر .

مثال 15


    enum Enum_Name:int  
    {  
        Sun, Mon, Tue, Wed, Thu, Fri, Sat  
    };  
      
    static void Main(string[] args)  
    {  
       Console.WriteLine( Enum.Format(typeof(Enum_Name), 3, "X"));  
       Console.WriteLine(Enum.Format(typeof(Enum_Name), 3, "x"));  
       Console.WriteLine(Enum.Format(typeof(Enum_Name), 3, "G"));  
       Console.WriteLine(Enum.Format(typeof(Enum_Name), 3, "g"));  
       Console.WriteLine(Enum.Format(typeof(Enum_Name), 3,"F"));  
       Console.WriteLine(Enum.Format(typeof(Enum_Name), 3, "f"));  
       Console.WriteLine(Enum.Format(typeof(Enum_Name), 3, "D"));  
       Console.WriteLine(Enum.Format(typeof(Enum_Name), 3, "d"));  
          
        Console.ReadLine();  
    }    

خروجی

“Format” یک نوع خاص از یک شمارنده را به معادل رشته ای آن بر اساس فرمت خاص تبدیل می کند .

مثال 16


    enum Enum_Name:int  
    {  
       Sun, Mon, Tue, Wed, Thu, Fri, Sat  
    };  
      
    static void Main(string[] args)  
    {  
      
       Console.WriteLine(Enum.IsDefined(typeof(Enum_Name),3));  
       Console.WriteLine(Enum.IsDefined(typeof(Enum_Name), 6));  
       Console.WriteLine(Enum.IsDefined(typeof(Enum_Name), 9));   
       Console.ReadLine();  
    }   

خروجی

IsDefined مقداری بازمیگرداند اعم از اینکه آیا  ثابتی با مقدار خاص در یک شمارنده خاص وجود دارد یا خیر .

مثال 17


    enum Enum_Name:int  
    {  
       Sun, Mon, Tue, Wed, Thu, Fri, Sat  
    };  
      
    static void Main(string[] args)  
    {  
      
      
       Console.WriteLine(Enum.ToObject(typeof(Enum_Name), 2));  
       Console.WriteLine(Enum.ToObject(typeof(Enum_Name), 5));  
       Console.ReadLine();  
    }   

خروجی

ToObject عدد صحیح مشخص شده 32 بیتی را به یک عضو شمارنده تبدیل می کند .

مثال 18


    enum Enum_Name:int  
    {  
        Sun, Mon, Tue, Wed, Thu, Fri, Sat  
    };  
      
    static void Main(string[] args)  
    {  
      
       
        Enum_Name Nm2;  
      
        Nm2 = (Enum_Name)Enum.Parse(typeof(Enum_Name), "tue",true);  
          
        if (Nm2 == Enum_Name.Tue)  
            Console.WriteLine("Both Are Same");  
      
        Console.ReadLine();  
    }    

خروجی

Both Are the Same

Pasre نمونه ی رشته ای از نام یک مقدار عددی را به یک یا بیشتر ثابت شمارش شده در یک شی برابرتبدیل می کند . این پارامتر مشخص می کند که ایا این عملیات حساس به لغت(case insensitive) است یا خیر . در این مثال True نشان می دهد که عملیات حساس به لغت(case insensitive) است .

مثال 19


    enum Enum_Name:int  
    {  
        Sun, Mon, Tue, Wed, Thu, Fri, Sat  
    };  
      
    static void Main(string[] args)  
    {  
      
       
        Enum_Name Nm2;  
      
        try  
        {  
            Nm2 = (Enum_Name)Enum.Parse(typeof(Enum_Name), "tue", false);  
      
            if (Nm2 == Enum_Name.Tue)  
                Console.WriteLine("Both Are Same");  
        }  
        catch(Exception Exp)  
        {  
            Console.WriteLine("Error Occur");  
            Console.WriteLine(Exp.ToString());  
        }  
      
        Console.ReadLine();  
    }    

خروجی

این مثال نشان می دهد که اگر این پارامترها را برابر False قرار دهیم عملکرد case-sensitive است و اگر یک شی در شمارنده یافت نشود یک خطا ارسال خواهد کرد .

مثال 20

من فکر می کنم اگر Enum Flags را توضیح ندهم این مقاله کامل نخواهد بود .

Flag Enum چیست ؟

Flag Enum یک متغیر enum ایجاد می کند که شامل مقادیر چندگانه می  باشد .

 به مثال زیر توجه کنید :


    [Flags]  
    enum Enum_Name:int  
    {  
        Sun=1,  
        Mon=2,  
        Tue=4,  
        Wed=8,  
        Thu=16,  
        Fri=32,  
        Sat=64  
    };  
      
      
    static void Main(string[] args)  
    {  
      
       
        Enum_Name Nm2;  
      
        Enum_Name Enm;  
        Enm = Enum_Name.Sun | Enum_Name.Thu | Enum_Name.Sat;  
        Console.WriteLine(Enm);  
        Console.ReadLine();  
    }    

خروجی

توجه :

مقدار یک شمارنده باید با توان 2 افزایش یابد .

سوالی که پیش مبی اید این است که فایده ذخیره مقادیر چندگانه در یک شمارنده چیست . فرض کنید که در یک شرکت کار می کنید و قانونی وجود دارد که در هر دوشنبه ، چهارشنبه و شنبه باید لباس رسمی بپوشند . چگونه باید بخاطر داشته باشند که در کدام روزهای هفته کارمندان باید لباس رسمی بپوشند .

2 راه برای این کار وجود دارد :

1 . یک آرایه ایجاد می کنیم و روزهای هفته که کارمندان باید لباس رسمی بپوشند را در آن ذخیره می کنیم. این راه مناسبی نیست  زیرا فضای زیادی را اشغال می کند.

2 .استفاده از یک Flag Enum بسیار موثرتر است .

نحوه انجام آن به صورت زیر می باشد :


    enum Enum_Name:int  
    {  
        Sun=1,  
        Mon=2,  
        Tue=4,  
        Wed=8,  
        Thu=16,  
        Fri=32,  
        Sat=64  
    };  
      
      
    static void Main(string[] args)  
    {  
      
       
        Enum_Name Nm2;  
      
        Enum_Name Enm;  
        Enm = Enum_Name.Mon | Enum_Name.Wed | Enum_Name.Sat;  
        Enum_Name Check = Enum_Name.Mon;  
      
        if ((Enm & Enum_Name.Mon) == Check)  
            Console.WriteLine("Employee Must Be in Formal Dress Code");  
        else  
            Console.WriteLine("Employee May Be in Formal Dress Code");  
      
        Check = Enum_Name.Thu;  
      
        if ((Enm & Enum_Name.Mon) == Check)  
            Console.WriteLine("Employee Must Be in Formal Dress Code");  
        else  
            Console.WriteLine("Employee May Be in Formal Dress Code");  
          
        Console.ReadLine();  
    }    

 خروجی

آموزش سی شارپ

قربانی

نویسنده 44 مقاله در برنامه نویسان
  • C#.net
  • 5k بازدید
  • 2 تشکر

کاربرانی که از نویسنده این مقاله تشکر کرده اند

در صورتی که در رابطه با این مقاله سوالی دارید، در تاپیک های انجمن مطرح کنید