کار با enum ها (انواع شمارشی) در سی شارپ


دات وایت | DotWhite.ir
کار با enum ها (انواع شمارشی) در سی شارپ

در این پست از دات وایت میخواهیم کار با enum ها یا به اصطلاح انواع شمارشی را در سی شارپ برای شما آموزش بدیم از جمله از بخش های این آموزش عبارتند از نوع داده ي شمارشي (enum) ، کار با نوع داده ي شمارشي (enum) ، متد های System. Enum ، انوع شمارشي (enum) و flagهای بیتی.


نوع داده ي شمارشي

نوع داده شمارشي كه در سی شارپ به enum معروف است، يك روش مناسب براي ايجاد يك مجموعه ساخت يافته از سمبل ها جهت نمايش مقادير ثابت پيشنهاد مي كند.

گرامر : 

[access modifiers]enum <identifier> [:enum-base]{enum body}


مثال : 

enum Fabric :short {

Cotton = ١,

Silk = ٢,

Wool = ٤,

Rayon = ٨,

Other = ١٢٨

}

توجه: اگر سمبل هاي enum به يك مقدار خاصي تنظيم نشده باشند، آنها به طور اتوماتيك با دنباله 0و 1 و 2 و 3 و ..... تنظيم مي شوند.


مثال(2) :

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 را تعريف م يكنند. به طور پيش فرض internal است و اجازه م يدهد فقط كلاسهاي داخل آن اسمبلي به آن دسترسي داشته باشند. معرف public آن را براي هر كلاسي در هر اسمبلي قابل دسترس مي سازد. گزينة اختياري enum-base نوع داده پاية ثابت ها را بر اساس مقادير تخصيصيافته به آنها مشخص مي كند. آن فقط مي تواند يكي از انواع صحيح long ،unit ،int ،ushort ،short ،sbyte ،byte یا ulong باشند. به طور پيش فرض int است.


كار با نوع داده شمارشي

انواع شمارشي نه تنها خوانايي برنامه را بهتر مي كنند، بلكه هنگام تغيير مقدار اصلي، تغييرات كد را نيز كاهش مي دهند و ارجاعات به آن مقدار، معتبر مي مانند. مزيت ديگر اينكه انواع شمارشي، نوع داده قوي هستند. بدين معني كه هر وقت يك نوع enum به عنوان پارامتر ارسال شود، متد دريافت كننده بايد يك پارامتر مطابق با همان نوع داشته باشد. درغير اينصورت كامپايلر خطا رخ مي دهد. قطعه كد زیر اين اهداف را با استفاده از نوع داده شمارشي Fabric نشان مي دهد. 

مثال (3)

static double GetPrice(Fabric fab)

 {

   switch(fab)

    {

      case Fabric.Cotton: return(٣٫٥٥);

      case Fabric.Silk: return(٥٫٦٥);

      case Fabric.Wool: return(٤٫٠٥);

      case Fabric.Rayon: return(٣٫٢٠);

      case Fabric.Other: return(٢٫٥٠);

      default: return(٠٫٠);

     }

     }

   static void Main()

    {

      Fabric fab = Fabric.Cotton;

      int fabNum = (int) fab; // ١

      string fabType = fab.ToString(); // "Cotton"

      string fabVal = fab.ToString("D"); // "١"

      double cost = GetPrice(fab); // ٣٫٥٥

   }

نكات:

   - براي مقداردهي enum به يك مقدار صحيح، قال ببندي آن لازم است . 

fabNum =(int) fab;

   - با متد ()ToString و پارامتر "D" مي توان مقدار رشت هاي يك ثابت را بدست آورد.

   - در هنگام ارسال يك نمونه از نوع شمارشي Fabric به متد GetPrice لازم است پارامتر متد از همان نوع اعلان شده باشد.


اين مثال نشان ميدهد كه نحوه ي به دست آوردن نام سمبل يا مقدار ثابت نوع شمارشي ساده است. دات وایت زماني كه نمونه اي از يك نوع داده شمارشي مشخص باشد، به راحتي مي توان اعضاء يك نوع داده شمارشي را به كمك كلاس System.Enum و حلقه foreach به دست آورد.


متد های System.Enum

متدهاي Parse.Enum،IsDefined.Enum و Getname.Enum ،سه متد مفيد Enum.System هستند. اغلب دو متد اول با هم به كار ميروند تا مشخص كنند آيا يك مقدار يا سمبل عضو يك enum است و يك نمونه از آن ايجاد ميكنند. براي فهم بهتر مطلب، مثالهاي زير را در نظر بگيريد. در اين مثال نوع شمارشيFabric براي وجود يك مقدار رشتهاي در آن جستجو ميشود و متدGetName يكي از مقادير آن را چاپ ميكند.

مثال (4)

  string fabStr = "Cotton";

 // Determine if symbol Cotton exists in Fabric enum

 if (Enum.IsDefined(typeof(Fabric),fabStr))

  {

    // Create enum instance

    Fabric fab = (Fabric)Enum.Parse( typeof(Fabric) , fabStr);

    // Output from the following statement is: "Silk"

   Console.WriteLine("Second value of Fabric Enum is: " + Enum.GetName(typeof(Fabric), ٢));

  }

متدISDefined دو پارامتر ميگيرد: يك نوع شمارشي كه عملگر typeof بر ميگرداند و يك رشته كه سمبل مورد نظر جهت تست را نشان ميدهد. شكل ديگر اين متد با مقدار عددي براي پارامتر دوم است. متدParse همان پارامترهاي IsDefined را ميگيرد و يك نمونه از نوع دادهي شمارشي ايجاد ميكند. متغير fab ايجاد شده در اينجا معادل همان متغير قطعه كد مثال (3) است. اطمينان از وجود عضو enum ،قبل از كاربرد متد Parse مهم است، اگر آن عضو وجود نداشته باشد يك استثناء روي ميدهد. متد GetName يك مقدار رشتهاي از enumاي كه مقدار آن در پارامتر دوم ارسال ميشود بر ميگرداند. در اين مثال ”Silk” برگردانده ميشود، چون مقدار ثابت آن 2 است.


انواع شمارشي و flagهاي بيتي

تنظيم مقادير نوع شمارشي Fabric با توانهايي از 2 تصادفي نيست. بيشتر موارد، اعضاي نوع شمارشي در عمليات منطقي استفاده ميشوند. اين مقادير در نگاشت به مقادير بيتي منحصر به فرد مفيد هستند. ممكن است تركيبي از اين مقادير را در كدنويسي تعيين كنيد.

 Fabric cotWool = Fabric.Cotton | Fabric.Wool;

Console.WriteLine(cotWool.ToString()); // Output: ٥

خروجي در صورتي بامعني خواهد بود، كه آن تركيبي از Wool و Cotton باشد. ميتوان اين كار را با اضافه كردن صفت [flags] به اعلان نوع شمارشي انجام داد.

 [Flags] 

enum Fabric :short {

متد ()ToString اعلان نوع شمارشي را بررسي ميكند. اگر اين صفت موجود باشد، آن نوع شمارشي را به صورت يك مجموعه از اعضاي نگاشت بيتي در نظر ميگيرد. در اين مثال نميتوان يك مقدار سمبليك معادل 5 پيدا كرد، پس متد ()ToString الگوي بيتي "101" را بكار ميبرد و سمبلهايي كه الگوهاي بيتي "001" و "100" دارند را چاپ ميكند. خروجي جديد يك ليست جدا شده با كاما است."wool , cotton".



تاریخ انتشار : سه شنبه 30 آذر 1395 ساعت: 12:32 | نظرات()
برچسب ها : , , , , , , ,

نویسنده :

بازديد : 621

موضوع: سی شارپ , کد های مفید ,

بخش نظرات این مطلب
نام
ایمیل (منتشر نمی‌شود) (لازم)
وبسایت
:) :( ;) :D ;)) :X :? :P :* =(( :O @};- :B /:) :S
نظر خصوصی
مشخصات شما ذخیره شود ؟ [حذف مشخصات] [شکلک ها]
کد امنیتیرفرش کد امنیتی