ุชุนุงู„ู‰ ู†ุชุฎูŠู„ ุฅู†ู†ุง ุนุงูŠุฒูŠู† ู†ุฎุฒู† ุนู†ุฏู†ุง ุฃูŠุงู… ุงู„ุฃุณุจูˆุน ููŠ ุงู„ูƒูˆุฏ. ููŠู‡ ุญุฏ ู…ู…ูƒู† ูŠู‚ูˆู„: โ€œู†ุฎุฒู† ุฃุฑู‚ุงู…ุŒ ุฑู‚ู… 1 ุฏุง ุงู„ุณุจุชุŒ ูˆู‡ูƒุฐุงโ€. ุจุณ ู‡ู„ ุงู„ุทุฑูŠู‚ุฉ ุฏูŠ ู…ู‚ุฑูˆุกุฉ ูˆู…ูู‡ูˆู…ุฉ ุจุงู„ู†ุณุจุงู„ูŠ ูƒู€ DeveloperุŸ ุฃูƒูŠุฏ ู„ุฃ.

ู‡ู†ุง ุจูŠูŠุฌูŠ ุฏูˆุฑ ุงู„ู€ EnumุŒ ูˆู‡ูˆ ุนุจุงุฑุฉ ุนู† Data Type ุงู†ุช ุงู„ู„ูŠ ุจุชุญุฏุฏ ุงู„ู€ Values ุงู„ู„ูŠ ู…ู…ูƒู† ูŠุงุฎุฏู‡ุง. ู†ู‚ุฏุฑ ู†ุนุชุจุฑู‡ ู†ูˆุน ุฎุงุต ู…ู† ุงู„ู€ Value Types ุจูŠุณุชุฎุฏู… ุนุดุงู† ู†ุนุฑู ู…ุฌู…ูˆุนุฉ ู…ู† ุงู„ุซูˆุงุจุช ุงู„ู„ูŠ ู„ูŠู‡ุง ุฃุณู…ุงุก (Named Constants).

ุงุณุชุฎุฏุงู… ุงู„ู€ Enum ุจูŠุญุณู† ุงู„ู€ Readability (ู‚ุฑุงุกุฉ ุงู„ูƒูˆุฏ) ุจุดูƒู„ ูƒุจูŠุฑ ุฌุฏุงู‹ุŒ ูˆุจูŠู…ู†ุน ุงุณุชุฎุฏุงู… ุงู„ู€ โ€œMagic Stringsโ€ุŒ ูˆูƒู…ุงู† ุจูŠู‚ู„ู„ ุงุญุชู…ุงู„ูŠุฉ ุฅู†ูƒ ุฅู†ุช ูˆุฒู…ุงูŠู„ูƒ ุงู„ู„ูŠ ุดุบุงู„ูŠู† ุนู„ู‰ ู†ูุณ ุงู„ุจุฑูˆุฌูƒุช ุชุบู„ุทูˆุง.

Enum Memory & Concept

ุงู„ู€ Enum ุจุจุณุงุทุฉ ู‡ูˆ ุฅุนุงุฏุฉ ุชุณู…ูŠุฉ ู„ุจุนุถ ุงู„ู‚ูŠู… ุงู„ุฑู‚ู…ูŠุฉ (ุฒูŠ ุงู„ู€ int) ูˆุจุชุฏูŠู‡ุง ุฃุณุงู…ูŠ ุฃูˆ Labels. ูŠุนู†ูŠ ู‡ูˆ ููŠ ุงู„ุฃุณุงุณ ู…ุญุฌูˆุฒ ููŠ ุงู„ู€ Memory ููŠ ู…ุณุงุญุฉ 4 bytes. ุจู†ุณุชุฎุฏู…ู‡ ู„ู…ุง ูŠุจู‚ู‰ ุนู†ุฏูŠ ู…ุฌู…ูˆุนุฉ ู…ุญุฏุฏุฉ ู…ู† ุงู„ู€ Values ูˆุนุงูŠุฒ ุฃุนู…ู„ู‡ู… Data Type ุฎุงุตุฉ ุจูŠู‡ู….

ูŠุนู†ูŠ ู„ูˆ ุฃู†ุง ุจุฎุฒู† ุฃุฑู‚ุงู…ุŒ ู…ู†ุทู‚ูŠ ุฃุญุทู‡ุง ููŠ intุŒ ุจุณ ู„ูˆ ุจุฎุฒู† ู†ูˆุน ุงู„ุฌู†ุณ (Gender) ุงู„ู„ูŠ ู‡ูˆ M ุฃูˆ FุŒ ูู‡ู†ุง ุงู„ุฃูุถู„ ุฃุนู…ู„ู‡ุง Data Type ุฎุงุตุฉ ุจูŠู‡ุง ุจุงุณุชุฎุฏุงู… ุงู„ู€ Enum.

Basic Syntax & Examples

ุนุดุงู† ู†ุนุฑู ุงู„ู€ Enum ุจู†ุณุชุฎุฏู… ุงู„ูƒู„ู…ุฉ ุงู„ู…ุญุฌูˆุฒุฉ enum ูˆุจู†ูƒุชุจ ุฌูˆุงู‡ Labels (ู…ู…ูƒู† ุชูƒูˆู† ูƒู„ู…ุงุช ุฃูˆ ุฃูŠ ุญุงุฌุฉ ุจุชุนุจุฑ ุนู† ุงู„ู‚ูŠู…ุฉ).

Days of the Week Example

// Enum definition
enum WeekDays 
{ 
	Sunday, 
	Monday, 
	Tuesday, 
	Wednesday, 
	Thursday, 
	Friday, 
	Saturday 
}
 
// Main
WeekDays today = WeekDays.Monday; 
Console.WriteLine(today); // Output: Monday

Grades and Gender Examples

enum Grades
{
	A, B, C, D, E // Labels: may be word or smth
}
 
enum Gender
{
	Male = 1, Female = 2, M = 1, F = 2
}
 
// Main
Grades myGrade = Grades.A;
myGrade = Grades.C;

Enum Values & CLR

ุฒูŠ ู…ุง ู‚ูˆู„ู†ุง ุฅู† ุงู„ู€ Enum ุจูŠุชุนุงู…ู„ ุจุงู„ู€ LabelsุŒ ุจุณ ุงู„ู€ CLR ููŠ ุงู„ุญู‚ูŠู‚ุฉ ู…ุด ุจูŠุชุนุงู…ู„ ุจุงู„ู€ Labels ุฏูŠุŒ ุงู„ู€ CLR ุจูŠุฏูŠ ู„ูƒู„ Label ู…ู†ู‡ู… ุฑู‚ู… ุจูŠุชุนุงู…ู„ ุจูŠู‡.

ุงู„ูˆุถุน ุงู„ุงูุชุฑุงุถูŠ (By default) ุฅู† ุงู„ู€ Values ุจุชุงุนุฉ ุงู„ู€ Enum ุจุชูƒูˆู† ู…ู† ู†ูˆุน int. ุฃูˆู„ ู‚ูŠู…ุฉ ุจุชุจุฏุฃ ุจู€ 0 ูˆูƒู„ ู‚ูŠู…ุฉ ุจุนุฏู‡ุง ุจุชุฒูŠุฏ ุจู…ู‚ุฏุงุฑ 1. ุจุณ ุทุจุนุงู‹ ุชู‚ุฏุฑ ุชุบูŠุฑ ุงู„ู€ Default Values ุฏูŠ ู„ุฃุฑู‚ุงู… ู…ุฎุตุตุฉ ุฒูŠ ู…ุง ุงู†ุช ุนุงูŠุฒุŒ ูˆู…ู…ูƒู† ู†ุณุชุฎุฏู… ุงู„ุฃุฑู‚ุงู… ุฏูŠ ูƒู€ IDs.

Custom Values Example

enum Branches
{
	SV = 105, NasrCity = 201, Alex = 221, Assuit
	// Assuit = 222
	// We can use it with IDs
}
 
enum OrderStatus 
{ 
	Pending, 
	Processing, 
	Shipped, 
	Delivered 
}
 
// Main
Branches MYB = new Branches(); // Default int: 0
MYB = Branches.Alex;
 
OrderStatus status = OrderStatus.Shipped; 
if (status == OrderStatus.Shipped) 
	Console.WriteLine("Your order is on the way!");

Size for Variables

ุฒูŠ ู…ุง ู‚ูˆู„ู†ุงุŒ ุงู„ู€ Enum ุจูŠุงุฎุฏ 4 bytes ู„ุฃู†ู‡ ุจูŠุนุชุจุฑ int. ุจุณ ููŠ ุฃู…ุซู„ุฉ ู…ุนูŠู†ุฉ (ู„ูˆ ุฃู†ุง ุจุฎุฒู† 0 ูˆ 1 ูˆ 2 ุจุณ)ุŒ ุฃู†ุง ู…ุด ู…ุญุชุงุฌ ูƒู„ ุงู„ู…ุณุงุญุฉ ุฏูŠ ููŠ ุงู„ู€ Memory. ู‡ู†ุง ู…ู…ูƒู† ุฃู‚ูˆู„ู‡ ุจุจุณุงุทุฉ: โ€œุฎู„ูŠ ุงู„ู†ูˆุน ุงู„ู„ูŠ ุจูŠุชุฎุฒู† byteโ€.

enum Branches : byte // Inheritance but I don't mean here inher
{
	// Labels
}

Type Casting & Conversions

ุนุดุงู† ู†ุญูˆู„ ุจูŠู† ุงู„ู€ Enum ูˆุงู„ุฃู†ูˆุงุน ุงู„ุชุงู†ูŠุฉุŒ ุจู†ุญุชุงุฌ ู†ุณุชุฎุฏู… ุงู„ู€ Casting.

enum Colors { Red = 1, Green = 2, Blue = 3, Yellow = 5 }
 
// Main
Colors c = Colors.Green; 
 
// Enum to int 
int value = (int)c; // Output: 2
 
// Int to enum 
Colors color = (Colors)2; // Output: Green
 
// Enum to string 
string name = c.ToString(); // Output: "Green"

ู†ู‚ุทุฉ ู…ู‡ู…ุฉ ู‡ู†ุง: ู„ูˆ ุญุงูˆู„ุช ุชุฏูŠ ุงู„ู€ Enum ุฑู‚ู… int ู…ุจุงุดุฑุฉ ู‡ูŠุฏูŠู„ูƒ ErrorุŒ ู„ุงุฒู… ุชุนู…ู„ Explicit Casting. ูˆูƒู…ุงู† ู„ูˆ ุฅุฏูŠุชู‡ ู‚ูŠู…ุฉ (ุฑู‚ู…) ู…ุด ู…ูˆุฌูˆุฏุฉ ุฃุตู„ุงู‹ ููŠ ุงู„ู€ LabelsุŒ ุจูŠุทุจุน ุงู„ุฑู‚ู… ุฒูŠ ู…ุง ู‡ูˆ ู…ู† ุบูŠุฑ ู…ุง ูŠุถุฑุจ Error.

// int assignment
myGrade = 2; // Error
myGrade = (Grades)2; // Explicit casting: myGrade = Grades.C
 
// Casting a non-existent value
myGrade = (Grades)8; 
Console.WriteLine(myGrade); // Output: 8

Control Flow & Iteration

ู…ู…ูƒู† ู†ุณุชุฎุฏู… ุงู„ู€ Enum ู…ุน ุงู„ู€ switch ูˆุงู„ู€ foreach ุจุณู‡ูˆู„ุฉ ุฌุฏุงู‹ ููŠ ุงู„ู€ Real Life Examples.

Switch Case Example

enum UserRole 
{ 
	Admin, 
	Moderator, 
	Guest 
} 
 
// Main
UserRole role = UserRole.Admin; 
switch (role) 
{ 
	case UserRole.Admin: 
		Console.WriteLine("Welcome, Admin!"); 
		break; 
	case UserRole.Moderator: 
		Console.WriteLine("Moderator panel unlocked."); 
		break; 
	case UserRole.Guest: 
		Console.WriteLine("Limited access."); 
		break; 
}

Iterate over Enum Values

foreach (Colors color in Enum.GetValues(typeof(Colors))) 
{ 
	Console.WriteLine($"Name: {color}, Value: {(int)color}"); 
}

Bit Flags with Enum

ู„ูˆ ุนุงูŠุฒ ู…ุซู„ุงู‹ ุฃุฎุฒู† ุฎุตุงุฆุต ู„ุฎุท ู…ุนูŠู† (Font)ุŒ ู‡ู„ ู‡ูˆ Bold ูˆู„ุง ู„ุฃุŒ ItalicุŒ ูˆ Underline. ุงู„ุญู„ ุงู„ู…ู…ูƒู† ู‡ู†ุง ุฅู†ูŠ ุฃุนู…ู„ Array of Booleans ูˆุฃุฎุฒู† ููŠู‡ ุงู„ู‚ูŠู… ุฏูŠุŒ ูˆูƒู„ Index ุจูŠู…ุซู„ ุญุงุฌุฉ ู…ุนูŠู†ุฉ.

bool[] Flages = new bool[4];

ุนูŠูˆุจ ุงู„ุทุฑูŠู‚ุฉ ุฏูŠ:

  1. ู„ูˆ ุนุงูŠุฒ ุฃุบูŠุฑ ูƒู„ ุงู„ู‚ูŠู… ุงู„ู„ูŠ ุฌูˆุงู‡ (ูŠุนู†ูŠ ุฃุฎู„ูŠ ูƒู„ ุงู„ุฎุตุงุฆุต ุชุชุบูŠุฑ)ุŒ ู‡ุญุชุงุฌ ุฃุณุชุฎุฏู… for loop ูˆุจูƒุฏุง ุงู„ู€ Time ู‡ูŠุจู‚ุง O(N).
  2. ูƒู…ุงู† ุฃู†ุง ู…ุญุชูุธ ููŠ ุงู„ู€ Memory ู„ู„ู€ Array ูƒู„ู‡ุง ุจู€ 4 bytes.

ูุจุฏู„ ู…ุง ุจุนุฑู 4 bytes ุนุดุงู† ุฃุนู…ู„ ุงู„ุญูˆุงุฑ ุฏุงุŒ ู…ู…ูƒู† ุฃุณุชุฎุฏู… 1 byte ุฅู†ูŠ ุฃุนู…ู„ ูƒู„ ุฏุง ุนู† ุทุฑูŠู‚ ุงุณุชุฎุฏุงู… ุงู„ู€ Bits. ุฏุง ูƒู…ุงู† ู‡ูŠุฏูŠู„ูŠ ู…ูŠุฒุฉ ุฅู†ูŠ ุฃู‚ุฏุฑ ุฃุบูŠุฑ ูƒู„ู‡ ููŠ Time O(1) ุนู† ุทุฑูŠู‚ ุงุณุชุฎุฏุงู… ุงู„ู€ Bitwise Operations ู…ู† ุบูŠุฑ Loop ูˆู„ุง ุญุงุฌุฉ.

graph LR
    A[Array Setup: 4 Bytes, Time O N] --> B[Index 0: Bold]
    A --> C[Index 1: Italic]
    A --> D[Index 2: Underline]
    
    E[Bit Flags Setup: 1 Byte, Time O 1] --> F[Bit 0: 1]
    E --> G[Bit 1: 0]
    E --> H[Bit 2: 1]
    
    style A fill:#f9f,stroke:#333,stroke-width:2px
    style E fill:#bbf,stroke:#333,stroke-width:2px

ุนุดุงู† ู†ุนู…ู„ ูƒุฏุงุŒ ุจู†ุณุชุฎุฏู… Attribute ุงุณู…ู‡ [Flags] (ุฒูŠ ุงู„ู€ Decorator ููŠ Angular ูƒุฏุงุŒ ู…ุฌุฑุฏ ุจูŠุนุฑู ุงู„ู€ Compiler ุฏุง ุนุจุงุฑุฉ ุนู† ุฅูŠู‡). ูˆู„ู…ุง ุจู†ุณุชุฎุฏู…ู‡ุŒ ู„ูˆ ุงู„ู€ Compiler ู…ู„ู‚ุงุด Label ุจูŠู…ุซู„ ุงู„ุฑู‚ู… ุงู„ู…ุนูŠู†ุŒ ุจูŠุญุงูˆู„ ูŠุฌูŠุจ ู…ุฌู…ูˆุนุฉ ุงู„ู€ Labels ุงู„ู„ูŠ ุจุชุฌู…ุนู‡ู… ูƒู„ู‡ู… ุณูˆุง.

Permissions Example

[Flags] 
// Attribute: Like decorator in Angular 
// (Just tell the compiler what is this?)
enum Permisions : byte
{
    Read = 8, Write = 0x04, Excute = 0b_0000_0010, Delete = 1, RootUser = 15
    // We can set it with any Form, it doesn't matter
}
 
// Main
Permisions PRM = new Permisions();
Console.WriteLine(PRM); // Output: 0
 
PRM = Permisions.Read;
Console.WriteLine(PRM); // Output: Read
 
PRM ^= Permisions.Write; // XOR: Toggle value
Console.WriteLine(PRM); // Output with flags: Write, Read; without: 12
 
PRM |= Permisions.Excute; // OR: Add new flag
PRM &= ~(Permisions.Excute); // NAND: Remove flag
 
PRM = (Permisions)15;
Console.WriteLine(PRM);
// Without RootUser label: Delete, Excute, Write, Read
// With RootUser label: RootUser
 
// Check if We can write
// AND: To check
if ((PRM & Permisions.Write) == Permisions.Write) 
    Console.WriteLine("True"); // Output: True

Enum Parsing

ุจุฌุงู†ุจ ุงู„ู„ูŠ ุงุชูƒู„ู…ู†ุง ุนู†ู‡ ููŠ ุงู„ู€ Type CastingุŒ ู†ู‚ุฏุฑ ู†ุนู…ู„ Parse ู„ู„ู€ Enum ู…ู† String. ู…ุซู„ุง ู„ูˆ ุฌูŠู†ุง ู†ุนู…ู„ Enum ู„ู„ูุตูˆู„ ุงู„ุฃุฑุจุนุฉุŒ ูˆู†ุงุฎุฏ ุงุณู… ุงู„ูุตู„ ู…ู† ุงู„ู€ UserุŒ ูˆู†ุทุจุนู„ู‡ ุงู„ุดู‡ูˆุฑ ุงู„ู…ุฎุตุตุฉ ู„ูŠู‡.

using System;
 
enum Season
{
    Spring,
    Summer,
    Autumn,
    Winter
}
 
class Program
{
    static void Main()
    {
        Console.WriteLine("Enter a season (Spring, Summer, Autumn, Winter):");
        string userInput = Console.ReadLine();
 
        try
        {
            // Parse the user input to a Season enum value
            Season season = (Season)Enum.Parse(typeof(Season), userInput, true);
 
            // Display the corresponding month range
            switch (season)
            {
                case Season.Spring:
                    Console.WriteLine("Spring: March to May");
                    break;
                case Season.Summer:
                    Console.WriteLine("Summer: June to August");
                    break;
                case Season.Autumn:
                    Console.WriteLine("Autumn: September to November");
                    break;
                case Season.Winter:
                    Console.WriteLine("Winter: December to February");
                    break;
                default:
                    Console.WriteLine("Invalid season.");
                    break;
            }
        }
        catch (Exception)
        {
            Console.WriteLine("Invalid input. Please enter a valid season name.");
        }
    }
}

Notes

  • ุงู„ุฌู…ู„ุฉ ุงู„ู…ูƒุชูˆุจุฉ enum Branches : byte ู…ุน ุงู„ุชุนู„ูŠู‚ Inheritance but I don't mean here inherุŒ ุงู‚ุตุฏ ุจูŠู‡ุง ุฅู† ุฏูŠ ู…ุด ุนู…ู„ูŠุฉ โ€œูˆุฑุงุซุฉโ€ (Inheritance) ุจุงู„ู…ูู‡ูˆู… ุงู„ู…ุชุนุงุฑู ุนู„ูŠู‡ ููŠ ุงู„ู€ OOP. ุฏูŠ ุจุจุณุงุทุฉ ุทุฑูŠู‚ุฉ ุจู†ุญุฏุฏ ุจูŠู‡ุง ุงู„ู€ Underlying Type (ุงู„ู†ูˆุน ุงู„ุฃุณุงุณูŠ ุงู„ุฏุงุฎู„ูŠ) ู„ู„ู€ Enum ุนุดุงู† ู†ูˆูุฑ ู…ุณุงุญุฉ ููŠ ุงู„ู…ูŠู…ูˆุฑูŠุŒ ูˆุจุฏู„ ู…ุง ูŠุฎุฒู† ุงู„ู‚ูŠู… ููŠ intุŒ ุจูŠุฎุฒู†ู‡ุง ููŠ byte.