آموزش کار با Enum در سی شارپ

Enum در سی شارپ

در این مقاله به آموزش کار با Enum در سی شارپ پرداختیم ، بدانیم enum چیست، چه کاربرد هایی دارد ، چگونه در سی شار از آن استفاده کنیم همه این آموزش ها در این مقاله مورد بررسی قرار گرفته است.فایل ها را میتوانید در محیط کنسول سی شارپ ایجاد کنید دقت کنید هر آموزش و Sampel در یک فایل جدا آموزش داده شده است.

Enum در سی شارپ

درابتدا بررسی می کنیم برای استفاده از Enum در سی شارپ به چه چیزهایی نیاز داریم. به قطعه کد زیر توجه کنید:

P1.cs


class Demo

{

public static void Main()

{

int Sunday = 0;

System.Console.WriteLine(Sunday);

}

}

خروجی


۰

برنامه بالا کامپایل شده و به درستی خروجی مدنظرمان را می دهد. در ادامه روزهای دیگر هفته را نیز اضافه می کنیم:

P2.cs


<span style="font-family: tahoma, sans-serif; font-size: 13px;">class Demo
{
public static void Main()
{
int Sunday = 0;
int Monday = 1;
int Tuesday = 2;
int Wednesday = 3;
int Thursday = 4;
int Friday = 5;
int Saturday = 6;
System.Console.WriteLine(Sunday);
System.Console.WriteLine(Monday);
System.Console.WriteLine(Tuesday);
System.Console.WriteLine(Wednesday);
System.Console.WriteLine(Thursday);
System.Console.WriteLine(Friday);
System.Console.WriteLine(Saturday);
}
}</span>

<span style="font-family: tahoma, sans-serif; font-size: 13px;">

 

خروجی :


۰۱۲۳۴۵۶

برنامه دوم نیز پس از کامپایل شدن خروجی مدنظرمان را تولید می کند. مطمئن هستم این نیازمندی ها، خسته کننده بوده و مجبورید هر بار علامت انتساب”=” گذاشته و سپس متغیرها را مقداردهی کنید.c# برای این مساله راه حلی مناسب دارد که کار را آسان می کند و این راه حل Enums است. حالا با استفاده از enums برنامه را بازنویسی می کنیم.

P3.cs


enum WeekDays

{

Sunday,

Monday,

Tuesday,

Wednesday,

Thursday,

Friday,

Saturday

}

&nbsp;

class Demo

{

public static void Main()

{

System.Console.WriteLine(WeekDays.Sunday);

System.Console.WriteLine(WeekDays.Monday);

System.Console.WriteLine(WeekDays.Tuesday);

System.Console.WriteLine(WeekDays.Wednesday);

System.Console.WriteLine(WeekDays.Thursday);

System.Console.WriteLine(WeekDays.Friday);

System.Console.WriteLine(WeekDays.Saturday);

}

}

خروجی


Sunday
Monday
Tuesday
Wednesday
Thursday
Friday
Saturday

همین طور که مشاهده می کنید خروجی برنامه بسیار واضح و برای خواننده قابل فهم است. اجازه بدهید برنامه بالا را بیشتر بررسی کنیم. Enum  اجازه یجاد نوع داده جدید را به ما می دهد. در برنامه بالا، نوع داده WeekDays  با استفاده از enum ایجاد شد. یک enum را می توان مانند یک شی استاتیکی از یک کلاس در نظر گرفت. به همین خاطر هست که می توانیم فقط با استفاده از نام enum ، به عنصر داخلی آن دسترسی پیدا کنیم برای مثال با استفاده از WeekDays.Sunday به Sunday که مقدار عنصر مربوط به این نام می باشد، دسترسی پیدا کردیم. در متد وقتی WriteLine() عنصر موجود درenum  را به عنوان enumName.elementName  بفرسیم(برای مثال WeekDays.Sunday)، خروجی نام عنصر را پس می دهد (مانند Sunday  در مثالمان)

 

در قسمت بعد می خواهیم خروجی به صورت اعداد باشد پس با ما همراه باشید.

P4.cs


enum WeekDays

{

Sunday,

Monday,

Tuesday,

Wednesday,

Thursday,

Friday,

Saturday

}

&nbsp;

class Demo

{

public static void Main()

{

System.Console.WriteLine((int)WeekDays.Sunday);

System.Console.WriteLine((int)WeekDays.Monday);

System.Console.WriteLine((int)WeekDays.Tuesday);

System.Console.WriteLine((int)WeekDays.Wednesday);

System.Console.WriteLine((int)WeekDays.Thursday);

System.Console.WriteLine((int)WeekDays.Friday);

System.Console.WriteLine((int)WeekDays.Saturday);

}

}

خروجی


۰
۱
۲
۳
۴
۵
۶

 

برای اینکه مقدار عددی معادل با WeekDays.Sunday را به دست بیاوریم بایدWeekDays.Sunday را به عدد(integer ) تبدیل کنیم و سپس به عنوان آرگومان به متد WriteLine() بفرستیم. همان طور که از نتایج خروجی مشخص است، اولین عنصر هر enum   به صورت پیش فرض با صفر مقداردهی می شود. سپس عناصر دیگر به ترتیب به اضافه یک می شوند. بنابراین Monday  ، ۱ و Tuesday ، ۲ و همین روند برای عناصر دیگر صدق می کند.

 

P5.cs


enum InitialDays
{
Sunday,
Monday,
Tuesday,
Wednesday,
}

enum WeekDays : InitialDays
{
Thursday,
Friday,
Saturday
}

class Demo
{
public static void Main()
{
System.Console.WriteLine((int)WeekDays.Sunday);
System.Console.WriteLine((int)WeekDays.Monday);
System.Console.WriteLine((int)WeekDays.Tuesday);
System.Console.WriteLine((int)WeekDays.Wednesday);
System.Console.WriteLine((int)WeekDays.Thursday);
System.Console.WriteLine((int)WeekDays.Friday);
System.Console.WriteLine((int)WeekDays.Saturday);
}
}

خروجی


P5.cs(9,17): error CS1008: Type byte, sbyte, short, ushort, int, uint, long, or ulong expected

در برنامه بالا خطایی رخ داده زیرا یک Enums نمی تواند از یک enums دیگر مشتق بشود. بنابراین ما اجازه نداریم WeekDays  را از InitialDays مشتق کنیم. اگر یک enums نمی تواند از یک enums دیگر مشتق شود پس آیا یک کلاس می تواند از یک enums مشتق بشود؟ در این به این سوال پاسخ خواهیم داد.

 

P6.cs


enum WeekDays

{

Sunday,

Monday,

Tuesday,

Wednesday,

Thursday,

Friday,

Saturday

}

&nbsp;

class Demo : WeekDays

{

public static void Main()

{

System.Console.WriteLine((int)WeekDays.Sunday);

System.Console.WriteLine((int)WeekDays.Monday);

System.Console.WriteLine((int)WeekDays.Tuesday);

System.Console.WriteLine((int)WeekDays.Wednesday);

System.Console.WriteLine((int)WeekDays.Thursday);

System.Console.WriteLine((int)WeekDays.Friday);

System.Console.WriteLine((int)WeekDays.Saturday);

}

}

&nbsp;

 

خروجی


P6.cs(12,7): error CS0509: 'Demo': cannot derive from sealed type 'WeekDays'
P6.cs(1,6): (Location of symbol related to previous error)

خطا رخ داد زیرا کلاس ها نمی توانند از روی enums مشتق بشوند. Enums  مانند sealed classes رفتار می کنند و در نتیجه تمامی قوانینی که در مورد sealed classes صدق می کنند برای enums هم صدق برقرار هستند.

P7.cs


enum WeekDays

{

Sunday,

Monday,

Tuesday,

Wednesday,

Thursday,

Friday,

Saturday,

Sunday

}

&nbsp;

class Demo

{

public static void Main()

{

System.Console.WriteLine((int)WeekDays.Sunday);

System.Console.WriteLine((int)WeekDays.Monday);

System.Console.WriteLine((int)WeekDays.Tuesday);

System.Console.WriteLine((int)WeekDays.Wednesday);

System.Console.WriteLine((int)WeekDays.Thursday);

System.Console.WriteLine((int)WeekDays.Friday);

System.Console.WriteLine((int)WeekDays.Saturday);

}

}

 

خروجی


P7.cs(10,4): error CS0102: The type 'WeekDays' already contains a definition
for 'Sunday'
P7.cs(3,4): (Location of symbol related to previous error)

 

خطای بالا به خاطر تعریف دو عضو با نام یکسان است. زیرا در enums (مثل کلاس ها)نمی توان دو عضو هم نام تعریف کرد.

 

P8.cs


enum WeekDays

{

Sunday=10,

Monday,

Tuesday,

Wednesday,

Thursday,

Friday,

Saturday

}

&nbsp;

class Demo

{

public static void Main()

{

System.Console.WriteLine((int)WeekDays.Sunday);

System.Console.WriteLine((int)WeekDays.Monday);

System.Console.WriteLine((int)WeekDays.Tuesday);

System.Console.WriteLine((int)WeekDays.Wednesday);

System.Console.WriteLine((int)WeekDays.Thursday);

System.Console.WriteLine((int)WeekDays.Friday);

System.Console.WriteLine((int)WeekDays.Saturday);

}

}

خروجی


۱۰
۱۱
۱۲
۱۳
۱۴
۱۵
۱۶

 

به راحتی می توانیم enum را با مقادیر ثابت، مقداردهی کنیم. در برنامه بالا، برای اولین عضو از enum یعنی Sunday مقدار ۱۰ را در نظر گرفتیم. سپس عضوهای بعدی،هر کدام، یکی بیشتر از عضو قبلی خودش را می گیرند.

P9.cs


enum WeekDays

{

Sunday,

Monday,

Tuesday,

Wednesday=10,

Thursday,

Friday,

Saturday

}

&nbsp;

class Demo

{

public static void Main()

{

System.Console.WriteLine((int)WeekDays.Sunday);

System.Console.WriteLine((int)WeekDays.Monday);

System.Console.WriteLine((int)WeekDays.Tuesday);

System.Console.WriteLine((int)WeekDays.Wednesday);

System.Console.WriteLine((int)WeekDays.Thursday);

System.Console.WriteLine((int)WeekDays.Friday);

System.Console.WriteLine((int)WeekDays.Saturday);

}

}

خروجی


۰
۱
۲
۱۰
۱۱
۱۲
۱۳

 

در برنامه قبلی دیدیم که به راحتی می توانیم عضوهای یک enum را با مقادیر ثابت، مقداردهی کنیم. در مثال بالا اولین عنصر به صورت پیش فرض مقدار ۰ را می گیرد. عضوهای بعد از آن به ترتیب مقادیر ۱و۲ را می گیرند. سپس چون Wednesday با عدد ثابت ۱۰ مقداردهی شده پس خروجی ۱۰ است. عناصر بعدی نیز، یک واحد بیشتر از عنصر قبلی هستند.

P10.cs


enum WeekDays

{

Sunday = 10,

Monday = 10,

Tuesday = 10,

Wednesday = 10,

Thursday = 10,

Friday = 10,

Saturday = 10

}

&nbsp;

class Demo

{

public static void Main()

{

System.Console.WriteLine((int)WeekDays.Sunday);

System.Console.WriteLine((int)WeekDays.Monday);

System.Console.WriteLine((int)WeekDays.Tuesday);

System.Console.WriteLine((int)WeekDays.Wednesday);

System.Console.WriteLine((int)WeekDays.Thursday);

System.Console.WriteLine((int)WeekDays.Friday);

System.Console.WriteLine((int)WeekDays.Saturday);

}

}

خروجی


۱۰
۱۰
۱۰
۱۰
۱۰
۱۰
۱۰

 

در برنامه بالا دیدیم که می توانیم تمام اعضای یک enum  را به طور یکسان مقداردهی کنیم و محدودیتی برای این کار وجود ندارد.

P11.cs


enum WeekDays

{

Sunday = 10000000000,

Monday = 10,

Tuesday = 10,

Wednesday = 10,

Thursday = 10,

Friday = 10,

Saturday = 10

}

&nbsp;

class Demo

{

public static void Main()

{

}

}

خروجی

 


a.cs(4,13): error CS0266: Cannot implicitly convert type 'long' to 'int'. An'
explicit conversion exists (are you missing a cast?)

به دلیل اینکه enum  ها از نوع int هستند پس اگر بخواهیم به آن، مقداری خارج از محدوده یک int بدهیم خطایی، مشابه خطای بالا خواهیم دید؛ که نشان می دهد که یک متغیرمان را بیشتر از ظرفیتش مقداردهی کردیم. در مثال بالا می خواستیم مقدار ۱۰۰۰۰۰۰۰۰۰۰  را در Sunday ذخیره کنیم. چون حداکثر ظرفیت متغیر از نوع int ، ۱۰۰۰۰۰۰۰۰۰۰ است پس با خطا روبرو می شویم.

 

برای رفع این خطا دو راه حل پیش رو داریم راه حل اول که بسیار هم آسان است ، ذخیره مقداری کمتر از ۱۰۰۰۰۰۰۰۰۰۰  در Sunday است.

 

P12.cs


enum WeekDays

{

Sunday = 100,

Monday = 10,

Tuesday = 10,

Wednesday = 10,

Thursday = 10,

Friday = 10,

Saturday = 10

}

&nbsp;

class Demo

{

public static void Main()

{

}

}

راه حل دوم استفاده از نوع داده دیگری است که ظرفیت بالاتر دارد و بتواند مقادیر بزرگ مثل ۱۰۰۰۰۰۰۰۰۰۰ را نگه دارد. در ادامه این راه حل را بررسی می کنیم.

P13.cs


enum WeekDays : long

{

Sunday = 10000000000,

Monday = 10,

Tuesday = 10,

Wednesday = 10,

Thursday = 10,

Friday = 10,

Saturday = 10

}

&nbsp;

class Demo

{

public static void Main()

{

}

}

در مثال بالا تمامی اعضای enum  را از Sunday  تا Saturday  را از نوع long تعریف می کنیم.

P14.cs


enum WeekDays

{

Sunday = 10,

Monday = Sunday,

Tuesday = Monday,

Wednesday = Tuesday,

Thursday = Wednesday,

Friday = Thursday,

Saturday = Friday

}

&nbsp;

class Demo

{

public static void Main()

{

System.Console.WriteLine((int)WeekDays.Sunday);

System.Console.WriteLine((int)WeekDays.Monday);

System.Console.WriteLine((int)WeekDays.Tuesday);

System.Console.WriteLine((int)WeekDays.Wednesday);

System.Console.WriteLine((int)WeekDays.Thursday);

System.Console.WriteLine((int)WeekDays.Friday);

System.Console.WriteLine((int)WeekDays.Saturday);

}

}

خروجی


۱۰

۱۰

۱۰

۱۰

۱۰

۱۰

۱۰

 

اعضای یک enum  را به وسیله اعضای enums  که قبلا تعریف شده اند، می توان تعریف کرد و محدودیت برای این موضوع وجود ندارد. به عبارت دیگر، در برنامه بالا، به ما این اجازه داده شده تا عضو Monday  را با استفاده از عضو Sunday( که قبلا تعریف شده) تعریف کنیم.

 

P15.cs


enum WeekDays

{

Sunday = 10,

Monday,

Tuesday,

Wednesday,

Thursday,

Friday,

Saturday

}

&nbsp;

class Demo

{

public static void Main()

{

WeekDays.Sunday = 36;

System.Console.WriteLine((int)WeekDays.Sunday);

}

}

خروجی

 


P15.cs(16,7): error CS0131: The left-hand side of an assignment must be a
variable, property or indexer

 

مقدار یک عضو از enum  به هیچ وجه قابل تغیر نیست و مثل یک ثابت(constant) عمل می کند. در برنامه بالا نمی توانیم در قسمت Main() مقدار مربوط به عضو Sunday  از enum  را تغییر بدهیم.

 

P16.cs


enum WeekDays

{

Sunday,

Monday,

Tuesday,

Wednesday,

Thursday,

Friday,

Saturday

}

&nbsp;

class Demo

{

public static void Main()

{

System.Console.WriteLine(WeekDays.Wednesday.CompareTo(WeekDays.Sunday));

System.Console.WriteLine(WeekDays.Wednesday.CompareTo(

WeekDays.Wednesday));

System.Console.WriteLine(WeekDays.Wednesday.CompareTo(

WeekDays.Saturday));

}

}

خروجی

 


۱

۰

-۱

آیا می توانیم اعضای enums را باهم مقایسه کنیم؟ ممکن است در قسمتی از برنامه بخواهیم بدانیم کدام عضو از بقیه اعضا بزرگتر یا کوچکتر و یا مساوی است. برای انجام این کار کافی است از متد CompareTo() استفاده کنیم. این متد به کلاس Enum  تعلق دارد؛و یک enum  از کلاس Enum  مشتق شده است. چون Wednesday  از Sunday  بزرگتر است پس خروجی ۱ است. به طور مشابه چون Wednesday  باWednesday  مساوی است پس خروجی مقدار ۰ را نشان می دهد و در نهایت خروجی ۱- است زیرا Wednesday  از Saturday کوچکتر است.

 

P17.cs


enum WeekDays

{

Sunday,

Monday,

Tuesday,

Wednesday,

Thursday,

Friday,

Saturday

}

&nbsp;

class Demo

{

public static void Main()

{

System.Console.WriteLine(WeekDays.Wednesday.ToString());

}

}

خروجی


Wednesday

 

با استفاده از تابع toString() به راحتی می توانیم اعضای Enum در سی شارپ را به رشته تبدیل کنیم. در برنامه کل اعضا را به رشته تبدیل می کنیم.

P18.cs


enum WeekDays

{

Sunday,

Monday,

Tuesday,

Wednesday,

Thursday,

Friday,

Saturday

}

&nbsp;

class Demo

{

public static void Main()

{

System.Console.WriteLine(WeekDays.Sunday.ToString());

System.Console.WriteLine(WeekDays.Monday.ToString());

System.Console.WriteLine(WeekDays.Tuesday.ToString());

System.Console.WriteLine(WeekDays.Wednesday.ToString());

System.Console.WriteLine(WeekDays.Thursday.ToString());

System.Console.WriteLine(WeekDays.Friday.ToString());

System.Console.WriteLine(WeekDays.Saturday.ToString());

}

}

خروجی

 


Sunday
Monday
Tuesday
Wednesday
Thursday
Friday
Saturday

 

اگر هزار عضو داشتیم باز هم تمایل داشتید از این روش استفاده کنید؟ مسلما خیر، زیرا نوشتن چندین WriteLine() کاری خسته کننده است پس با ما همراه بوده تا در برنامه بعدی یک روش ساده تر را مطرح کنیم.

P19.cs


enum WeekDays

{

Sunday,

Monday,

Tuesday,

Wednesday,

Thursday,

Friday,

Saturday

}

&nbsp;

class Demo

{

public static void Main()

{

string [] arr =  WeekDays.GetNames(typeof(WeekDays));

foreach(string s in arr)

System.Console.WriteLine(s);

}

}

خروجی

 


&nbsp;

Sunday
Monday
Tuesday
Wednesday
Thursday
Friday
Saturday

 

تابع استاتیکی GetNames() ، اعضای موجود در WeekDays  را به صورت یک آرایه از رشته ها بر می گرداند. با استفاده از foreach  یک حلقه ایجاد می کنیم و رشته های آرایه را چاپ می کنیم.

 

 


enum WeekDays
{
Sunday,
Monday,
Tuesday,
Wednesday,
Thursday,
Friday,
Saturday
}

class Demo
{
public static void Main()
{
System.Console.WriteLine(WeekDays.Monday + 100);
System.Console.WriteLine(100 + WeekDays.Monday);
}
}

 

خروجی


۱۰۱
۱۰۱

 

در این اجازه داریم تا اعضای C# را با اعداد جمع کنیم و برعکس.

P21.cs


enum WeekDays

{

Sunday,

Monday,

Tuesday,

Wednesday,

Thursday,

Friday,

Saturday

}

&nbsp;

class Demo

{

public static void Main()

{

System.Console.WriteLine(WeekDays.Monday + WeekDays.Monday);

}

}

خروجی

 


P21.cs(16,34): error CS0019: Operator '+' cannot be applied to operands of
type 'WeekDays' and 'WeekDays'

 

خطا! زیرا در C# نمی توان دو عضو از enum  را با هم جمع کرد. برای انجام این جمع، باید از یک عملگر + دیگری استفاده کنیم. حالا اگر عمگلر + اضافی مستقیما با اعضای enum  کار نکرد از عملگرهایی مثل ‘==’ و ‘<‘ و ‘>’ استفاده کنید.

P22.cs


enum WeekDays

{

Sunday,

Monday,

Tuesday,

Wednesday,

Thursday,

Friday,

Saturday

}

&nbsp;

class Demo

{

public static void Main()

{

System.Console.WriteLine(WeekDays.Monday == WeekDays.Monday);

System.Console.WriteLine(WeekDays.Monday != WeekDays.Monday);

System.Console.WriteLine(WeekDays.Monday < WeekDays.Tuesday);

System.Console.WriteLine(WeekDays.Monday > WeekDays.Tuesday);

}

}

خروجی


True
False
True
False

 

عملگرهای مقایسه در کار با عناصر اعضا overloaded هستند.( درست مانند سرعت کم ی که در کار با اعداد دارند)

بنابراین آیا می توانیم از این عملگرها برای مقایسه دو enums از خانواده های مختلف استفاده کرد؟ در ادامه به این سوال جواب خواهیم داد.

P23.cs


enum WeekDays

{

Sunday,

Monday,

Tuesday,

Wednesday,

Thursday,

Friday,

Saturday

}

&nbsp;

enum Days

{

Sunday,

Monday,

Tuesday,

Wednesday,

Thursday,

Friday,

Saturday

}

class Demo

{

public static void Main()

{

System.Console.WriteLine(WeekDays.Monday == Days.Monday);

}

}

 

خروجی


P23.cs(28,32): error CS0019: Operator '==' cannot be applied to operands of
type 'WeekDays' and 'Days'

 

با توجه به خطایی که در خروجی وجود دارد نتیجه می گیریم این عملگرها روی اعضایی که مربوط به enums مختلف هستند کار نمی کند.

مسعود شریفی پور

از سال 88 که با برنامه نویسی آشنا شدم خیلی علاقه مند بودم یک بستر آموزشی بسازم در فضای وب و به انتشار آموزش های در این زمینه بپردازم.حالا یک تیم داریم و با قدرت رو به جلو حرکت میکنیم.

نوشته‌های مرتبط

دیدگاه‌ها

*
*

این سایت از اکیسمت برای کاهش هرزنامه استفاده می کند. بیاموزید که چگونه اطلاعات دیدگاه های شما پردازش می‌شوند.

    اسماعیل پاسخ

    ممنون ، مرسی بابته زحمتی که میکشید

      مسعود شریفی پاسخ

      خواهش میکنم موفق باشید :)

    ملیحه پاسخ

    عالی بود
    بی نهایت ممنون و سپاسگزار