نوع داده enum در سی شارپ

Ratings
(0)

 

با استفاده از enum در سی شارپ، می توانیم یک مجموعه از مقادیر را نگهداری کنیم. enum یک کلاس خاص است که یک گروه از ثابت ها(constant) را در خود جای می دهد. برای ایجاد یک enum، از کلمه ی کلیدی enum استفاده کنید و آیتم های enum را با کاما از یکدیگر جدا کنید:


تعریف enum در سی شارپ

ما می توانیم با استفاده از کلمه ی کلیدی enum، به صورت زیر یک enum را تعریف کنیم:

enum Season
{
    Spring,
    Summer,
    Autumn,
    Winter
}

به طور پیش فرض، اعضای enum از نوع int هستند. ما می توانیم به صورت زیر، نوع اعضای enum را به صورت ushort مشخص کنیم:

enum ErrorCode : ushort
{
    None = 0,
    Unknown = 1,
    ConnectionLost = 100,
    OutlierReading = 200
}

enum ها، می توانند نوع های زیر را داشته باشند:

  1. byte
  2. sbyte
  3. short
  4. ushort
  5. int
  6. uint
  7. long
  8. ulong

 


مثال شماره 1

enum Level 
{
  Low,
  Medium,
  High
}

برای دسترسی به آیتم های enum، می توانیم از یک نقطه به صورت زیر استفاده کنیم:

Level myVar = Level.Medium;
Console.WriteLine(myVar);

نتیجه:

Medium

 


به طور پیش فرض، اولین آیتم از enum برابر با مقدار 0 و دومین آیتم برابر با مقدار 1 است و همین طور الی آخر.  برای دریافت مقدار صحیح(integer) از یک آیتم، باید این آیتم را به طور صریح(explicitly) به یک int تبدیل کنیم:

مثال شماره 2

using System;

namespace MyApplication
{
  class Program
  {
    enum Months
    {
      January,    // 0
      February,   // 1
      March,      // 2
      April,      // 3
      May,        // 4
      June,       // 5
      July        // 6
    }
    static void Main(string[] args)
    {
      int myNum = (int) Months.April;
      Console.WriteLine(myNum);
    }
  }
}

نتیجه:

3

ما همچنین می توانیم مقادیر enum دلخواه خود را انتساب دهیم و اعداد آیتم های بعدی بر این اساس آپدیت می شوند:

مثال شماره 3

using System;

namespace MyApplication
{
  class Program
  {
    enum Months
    {
      January,    // 0
      February,   // 1
      March=6,    // 6
      April,      // 7
      May,        // 8
      June,       // 9
      July        // 10
    }
    static void Main(string[] args)
    {
      int myNum = (int) Months.April;
      Console.WriteLine(myNum);
    }
  }
}

نتیجه:

7

 


تمرین عملی

1. یک اپلیکیشن کنسول جدید به نام Ch05Ex02 ایجاد کنید و آن را در آدرس زیر ذخیره کنید:

C:\BeginningCSharp7\Chapter05.

2. کد زیر را در Program.cs قرار دهید:

using static System.Console;
using static System.Convert;

namespace Ch05Ex02
{
  enum orientation : byte
{
  north = 1,
  south = 2,
  east = 3,
  west = 4
}
 class Program
 {
  static void Main(string[] args)
  {
    orientation myDirection = orientation.north;
    WriteLine($"myDirection = {myDirection}");
    ReadKey();
   }
 }
}

3. برنامه را اجرا کنید. خروجی شما باید مانند تصویر 5.5 باشد.

(تصویر 5.5)

برنامه آموزش سی شارپ

4. از اپلیکیشن خارج شوید و کدهای متد Main() را به صورت زیر اصلاح کنید:

byte directionByte;
string directionString;
orientation myDirection = orientation.north;
WriteLine($"myDirection = {myDirection}");
directionByte = (byte)myDirection;
directionString = Convert.ToString(myDirection);
WriteLine($"byte equivalent = {directionByte}");
WriteLine($"string equivalent = {directionString}");
ReadKey();

5. برنامه را دوباره اجرا کنید. خروجی در تصویر 5.6 نشان داده شده است.

(تصویر 5.6)

اجرای برنامه سی شارپ

 


توضیح کدهای مثال بالا

در این کدها، یک enum به نام orientation تعریف شده و از آن استفاده شده است. اولین چیزی که باید به آن توجه کنیم، این است که کدهای تعریف enum در namespace یعنی Ch05Ex02 قرار گرفته اند؛ اما در همان مکانی که بقیه ی کدها قرار گرفته اند، قرار ندارد. علتش این است که تعریف ها(definition) اجرا نمی شوند. یعنی، در یک تعریف، در زمان اجرا(runtime)، کدها قدم به قدم بررسی نمی شوند؛

اجرای برنامه از جایی که عادت دارید و به نوع جدید شما دسترسی دارد، آغاز می شود؛ زیرا به همان فضای نام(namespace) تعلق دارد. در اولین تکرار از این مثال، روش اصلی ایجاد یک متغیر از یک نوع جدید، نشان داده شده است؛ که یک مقدار به آن انتساب داده می شود و در صفحه ی نمایش، بعنوان خروجی نشان داده می شود. سپس، کدها را اصلاح می کنیم تا تبدیل مقادیر enum را در نوع های(types) دیگر نشان دهد. 

توجه کنید که در اینجا باید از تبدیلات صریح(explicit) استفاده کنیم؛ حتی با اینکه نوع پایه ی orientation بایت(byte) است، هنوز هم باید از cast یا تبدیل نوعِ (byte) برای تبدیل مقدار  myDirection به بایت استفاده کنیم:

directionByte = (byte)myDirection;

در جهتی دیگر، استفاده از همین تبدیل صریح ضروری است؛ همچنین اگر می خواهید یک بایت(byte) را به یک orientation تبدیل کنید. بعنوان مثال، می توانیم از کد زیر برای تبدیل یک متغیر byte به نام myByte به یک orientation استفاده کنیم و این مقدار را به myDirection انتساب دهیم:

myDirection = (orientation)myByte;

البته، در اینجا باید دقت کنید؛ زیرا همه ی مقادیر مجاز نوع byte با مقادیر تعریف شده ی orientation ارتباط ندارند. نوع orientation می تواند دیگر مقادیر byte را نیز ذخیره کند؛ بنابراین مستقیما یک خطا را دریافت نمی کنیم، اما این کار ممکن است بعداً در این اپلیکیشن باعث شکست منطق شود. برای تبدیل مقدار یک enum، به یک رشته، می توانید از دستور Convert.ToString() استفاده کنید:

directionString = Convert.ToString(myDirection);

استفاده از یک تبدیل نوعِ (string) کار نمی کند، زیرا پردازش مورد نیاز، پیچیده تر از قرار دادن داده ی ذخیره شده در متغیر enum در یک متغیر string است. به طور جایگزین، می توانیم از دستور ToString() روی خود متغیر استفاده کنیم. کد زیر نتیجه ای مانند استفاده از دستور Convert.ToString() به ما می دهد:

directionString = myDirection.ToString();

تبدیل یک رشته به یک enum نیز امکان پذیر است؛ به جز در اینجا که سینتکس مورد نیاز کمی پیچیده تر است. برای این نوع تبدیلات، یک دستور خاص نیز به نام Enum.Parse() وجود دارد که به صورت زیر از آن استفاده می شود:

(enumerationType)Enum.Parse(typeof(enumerationType), enumerationValueString);

این از یک عملگر دیگر به نام typeof استفاده می کند که نوع عملوند خود را به دست می آورد. شما به صورت زیر می توانید از این دستور برای نوع orientation خود استفاده کنید:

string myString = "north";
orientation myDirection = (orientation)Enum.Parse(typeof(orientation), myString);

البته، همه ی مقادیر رشته ای، با یک مقدار orientation ارتباط ندارند. اگر مقداری داشته باشیم که با یکی از مقادیر enum ارتباط نداشته باشد، یک خطا دریافت خواهیم کرد. مانند هر چیز دیگری در #C، این مقادیر به حروف بزرگ و کوچک حساس هستند. بنابراین اگر رشته ی شما مقداری را قبول کند که از همه نظر به جز حروف بزرگ و کوچک یکسان باشد، باز هم یک خطا دریافت خواهید کرد(بعنوان مثال، اگر myString به جای north، برابر با North باشد). 


منابع:

1. https://learn.microsoft.com/en-us

 2. https://www.w3schools.com/cs

 

  • بازدید: 84

نوشتن دیدگاه

لطفا نظرات خود را بیان کنید. به سوالات در سریع ترین زمان پاسخ داده خواهد شد.اما به نکات زیر توجه کنید:
1. سعی کنید نظرات شما مرتبط با مقاله ی مورد نظر باشد، در غیر این صورت پاسخ داده نخواهد شد.
2. سوالات خود را به صورت کوتاه بیان کنید و از پرسیدن چند سوال به طور همزمان خودداری کنید.
3. سوال خود را به طور واضح بیان کنید و از کلمات مبهم استفاده نکنید.

ارسال