مفهوم 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 تشکر