شمارش (Enumeration)

Enumeration یا شمارش راهی برای تعریف داده‌هایی است که می‌توانند مقادیر محدودی که شما از قبل تعریف کرده‌اید را بپذیرند. به عنوان مثال شما می‌خواهید یک متغیر تعریف کنید که فقط مقادیر جهت (جغرافیایی) مانند east، west، north و south را در خود ذخیره کند. ابتدا یک enumeration تعریف می‌کنید و برای آن یک اسم انتخاب کرده و بعد از آن تمام مقادیر ممکن که می‌توانند در داخل بدنه آن قرار بگیرند تعریف می‌کنید. به نحوه تعریف یک enumeration توجه کنید:

enum enumName
{
   value1,
   value2,
   value3,
   .
   .
   .
   valueN
}

ابتدا کلمه کلیدی enum و سپس نام آن را به کار می‌بریم. در سی شارپ برای نامگذاری enumeration از روش پاسکال استفاده کنید. در بدنه enum مقادیری وجود دارند که برای هر کدام یک نام در نظر گرفته شده است. به یک مثال توجه کنید :

enum Direction
{
   North,
   East,
   South,
   West
}

در حالت پیشفرض مقادیری که یک enumeration می‌تواند ذخیره کند از نوع int هستند. به عنوان مثال مقدار پیشفرض north صفر و مقدار بقیه مقادیر یک واحد بیشتر از مقدار قبلی خودشان است. بنابراین مقدار east برابر 1، مقدار south برابر 2 و مقدار west برابر 3 است. می‌توانید این مقادیر پیشفرض را به دلخواه تغییر دهید، مانند:

enum Direction
{
   North = 3,
   East = 5,
   South = 7,
   West = 9
}

اگر به عنوان مثال هیچ مقداری به یک عنصر اختصاص ندهید آن عنصر به صورت خودکار مقدار می کیرد.

enum Direction
{
   North = 3,
   East = 5,
   South,
   West
}

در مثال بالا مشاهده می‌کنید که ما هیچ مقداری به south در نظر نگرفته‌ایم بنابر این به صورت خودکار یک واحد بیشتر از east یعنی 6 و به west یک واحد بیشتر از south یعنی 7 اختصاص داده می‌شود. همچنین می‌توان مقادیر یکسانی برای عناصر enumeration در نظر گرفت. مثال :

enum Direction
{
   North = 3,
   East,
   South = North,
   West
}

می‌توانید مقادیر بالا را حدس بزنید؟ مقادیر north، east، south، west به ترتیب 3، 4، 3، 4 است. وقتی مقدار 3 را به north می‌دهیم مقدار east برابر 4 می‌شود. سپس وقتی مقدار southرا برابر 3 قرار دهیم به صورت اتوماتیک مقدار west برابر 4 می‌شود. اگر نمی‌خواهید که مقادیر آیتم‌های enumeration شما پیشفرض (از نوع int) باشد می‌توانید از نوع مثلاً byte به عنوان نوع داده‌ای آیتمهای آن اسفاده کنید.

enum Direction : byte
{
   North,
   East,
   South,
   West
}

نوع داده‌ای byte فقط شامل مقادیر بین 0 تا 255 می‌شود بنابر این تعداد مقادیر که شما می‌توانید به enumeration اضافه کنید محدود می‌باشد. به نحوه استفاده از enumeration در یک برنامه سی شارپ توجه کنید.

   1: using System;
   2: 
   3: enum Direction
   4: {
   5:     North = 1,
   6:     East,
   7:     South,
   8:     West
   9: }
  10: 
  11: public class Program
  12: {
  13:     public static void Main()
  14:     {
  15:         Direction myDirection;
  16: 
  17:         myDirection = Direction.North;
  18: 
  19:         Console.WriteLine("Direction: {0}", myDirection.ToString());
  20:     }
  21: }
Direction: North

ابتدا enumeration را در خطوط 9-3 تعریف می‌کنیم. توجه کنید که enumeration را خارج از کلاس قرار داده‌ایم. این کار باعث می‌شود که enumeration در سراسر برنامه در دسترس باشد. می‌توان enumeration را در داخل کلاس هم تعریف کرد ولی در این صورت فقط در داخل کلاس قابل دسترس است.

class Program
{
    enum Direction
    {
          //Code omitted
    }

    static void Main(string[] args)
    {
          //Code omitted  
    }
}

برنامه را ادامه می‌دهیم. در داخل بدنه enumeration نام چهار جهت جغرافیایی وجود دارد که هر یک از آنها با 1 تا 4 مقدار دهی شده‌اند. در خط 15 یک متغیر تعریف شده است که مقدار یک جهت را در خود ذخیره می‌کند. نحوه تعریف آن به صورت زیر است :

enumType variableName;

در اینجا enumType نوع داده شمارشی (مثلاً Direction یا مسیر) می‌باشد و variableName نیز نامی است که برای آن انتخاب کرده‌ایم که در مثال قبل myDirection است. سپس یک مقدار به متغیر myDirection اختصاص می‌دهیم (خط 17). برای اختصاص یک مقدار به صورت زیر عمل می‌کنیم :

variable = enumType.value;

ابتدا نوع Enumeration سپس علامت نقطه و بعد مقدار آن (مثلاً North) را می‌نویسیم. می‌توان یک متغیر را فوراً، به روش زیر مقدار دهی کرد :

Direction myDirection = Direction.North;

حال در خط 1۹ با استفاده از Console.WriteLine() مقدار myDirection را چاپ می‌کنیم. توجه کنید که با استفاده از متد ToString() مقدار عددی myDirection را به رشته، جهت چاپ تبدیل می‌کنیم.

تصور کنید که اگر enumeration نبود شما مجبور بودید که به جای کلمات اعداد را حفظ کنید چون مقادیر enumeration در واقع اعدادی هستند که با نام مستعار توسط شما یا هر کس دیگر تعریف می‌شوند. متغیرهای شمارشی می‌توانند به انواع دیگری مانند int یا string تبدیل شوند. همچنین یک مقدار رشته‌ای می‌تواند به نوع شمارشی معادلش تبدیل شود.