مفهوم 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(); }
خروجی
- C#.net
- 6k بازدید
- 2 تشکر