کلمه کلیدی enum برای اعلان مجموعه شمارشی (enumeration) استفاده می شود. enumeration یک نوع متمایز شامل مجموعه ای نامدار از ثابت ها است که به آنها لیست شمارشی می گویند.
معمولا" بهترین راه، اعلان enum مستقیما" درون namespace است، در نتیجه همه کلاس های داخل namespace می توانند بصورت مساوی به آن دسترسی داشته باشند. هرچند، یک enum می تواند بصورت تودرتو ، درون یک کلاس یا ساختار (struct) قرار گیرد.
بصورت پیش فرض، اولین enumerator (اعضای enum) مقدار صفر دارد و بقیه اعضا مقدارشان بصورت متوالی، یکی یکی افزایش پیدا می کند.
enum Days {Sat, Sun, Mon, Tue, Wed, Thu, Fri};
در این لیست شمارشی، Sat مقدار صفر دارد، Sun مقدار 1 دارد، Mon مقدار 2 دارد و الی آخر. enumerator ها می توانند برای رونویسی مقدار پیش فرضشان، مقدار دهی اولیه شوند. برای مثال:
enum Days {Sat=1, Sun, Mon, Tue, Wed, Thu, Fri};
در این لیست شمارشی، ترتیب اعضا بجای صفر از 1 شروع شده است. ولی ما شدیدا" پیشنهاد می کنیم که یک لیست شمارشی شامل ثابتی با مقدار صفر باشد. برای اطلاعات بیشتر به نکاتی در مورد نوع شمارشی مراجعه کنید.
همه نوع های شمارشی دارای یک نوع اساسی هستند که می توانند هر نوع صحیحی بجر char باشند. نوع اساسی پیش فرض اعضای لیست شمارشی int است. برای اعلان یک enum از یک نوع صحیح دیگر مانند byte ، از یک علامت نقل قول که بعد از آن نوع مربوطه آمده است ، استفاده کنید:
enum Days : byte {Sat=1, Sun, Mon, Tue, Wed, Thu, Fri};
برای enum ، نوع های byte، sbyte، short، ushort، int، uint، long یا ulong تصویب شده است.
به متغیری از نوع Days می توان هر مقداری در محدوده نوع اساسی، انتساب داد؛ مقادیر محدود به ثابت های نامدار نیستند.
مقدار پیش فرض enum E مقداری است که توسط عبارت E)0) تولید شده است.
نکته
نام یک عضو لیست شمارشی (enumerator) نباید حاوی فضای خالی باشد.
نوع اساسی تعیین می کند که برای هر کدام از اعضای لیست شمارشی، چه مقدار حافظه ، اختصاص پیدا کند. هرچند، برای تبدیل یک نوع enum به یک نوع عددی صحیح به یک قالبریزی صریح نیاز است. برای مثال، بیان زیر enumerator به نام Sun را با استفاده از یک قالبریز (cast) برای تبدیل enum به int ، به متغیری از نوع int انتساب می دهد:
int x = (int)Days.Sun;
وقتی شما System.FlagAttribute را به یک لیست شمارشی که حاوی تعدادی عنصر که با عملگر بیتی OR ترکیب شده اند ، اعمال می کنید، متوجه خواهید شد که این صفت (attribute) وقتی با برخی ابزارها مورد استفاده قرار می گیرد، بر رفتار enum تأثیر می گذارد. شما می توانید با ابزارهایی مثل متدهای کلاس Console ، ارزیابی کننده عبارت (Expression Evaluator) و غیره از چنین تغییراتی با خبر شوید. (مثال سوم را ببینید).
برنامه نویسی قوی
درست مثل همه ثابت ها، تمام ارجاع ها به مقادیر مستقل از enum ، در زمان کامپایل ، به لیترال های عددی تبدیل می شوند که می تواند قضایای نسخه بندی بالقوه را ایجاد کند که در قسمت "ثابت ها (راهنمای برنامه نویسی #C)" توضیح داده شده است.
انتساب مقادیر اضافی به نسخه های جدید enum، یا تغییر مقادیر اعضای enum در یک نسخه جدید، می تواند مشکلاتی برای کد منبع (Source Code) ایجاد کند. مقادیر شمارشی اغلب در بیان switch استفاده می شوند. اگر مقادیر اضافی به نوع enum اضافه شده باشد، بررسی مربوط به مقادیر پیش فرض می تواند بطور ناخواسته مقدار true برگرداند.
اگر توسعه دهندگان دیگر از کد شما استفاده خواهند کرد، شما می بایست در مورد چگونگی عکس العمل کد آنها در صورت اضافه شدن عناصر جدید به هر کدام از نوع های enum ، راهنمایی ارائه دهید.
مثال
در این مثال، یک لیست شمارشی به نام Days اعلان شده است. دو تا از enumerator (اعضای enum) بصورت صریح به نوع صحیح تبدیل شده و به یک متغیر نوع صحیح انتساب داده شده اند.
public class EnumTest { enum Days { Sun, Mon, Tue, Wed, Thu, Fri, Sat }; static void Main() { int x = (int)Days.Sun; int y = (int)Days.Fri; Console.WriteLine("Sun = {0}", x); Console.WriteLine("Fri = {0}", y); } } /* Output: Sun = 0 Fri = 5 */
در این مثال، از خاصیت نوع اساسی برای اعلان یک enum که اعضایش از نوع long هستند استفاده شده است. دقت کنید که با وجود اینکه نوع اساسی لیست شمارشی long است، اعضای لیست شمارشی باید با استفاده از یک قالبریز (cast) بصورت صریح به نوع long تبدیل شوند.
public class EnumTest2 { enum Range : long { Max = 2147483648L, Min = 255L }; static void Main() { long x = (long)Range.Max; long y = (long)Range.Min; Console.WriteLine("Max = {0}", x); Console.WriteLine("Min = {0}", y); } } /* Output: Max = 2147483648 Min = 255 */
در کد مثال زیر طرز استفاده و تأثیر صفت System.FlagsAttribute روی یک enum نشان داده شده است.
[Flags] public enum CarOptions { SunRoof = 0x01, Spoiler = 0x02, FogLights = 0x04, TintedWindows = 0x08, } class FlagTest { static void Main() { CarOptions options = CarOptions.SunRoof | CarOptions.FogLights; Console.WriteLine(options); Console.WriteLine((int)options); } } /* Output: SunRoof, FogLights 5 */
توضیحات
دقت کنید که اگر صفت FlagsAttribute را حذف کنید، مثال خروجی زیر را خواهد داشت:
5
5