CodeGym /Kurslar /C# SELF /Enum-lar (enum) C#-da: rahat adlandırılmış konstantlar

Enum-lar (enum) C#-da: rahat adlandırılmış konstantlar

C# SELF
Səviyyə , Dərs
Mövcuddur

1. Giriş

Proqramlaşdırmada tez-tez əvvəlcədən məlum olan, məhdud variantların siyahısı ilə işləmək lazım olur. Məsələn: həftənin günləri, işıqforun rəngləri, oyunun çətinlik səviyyələri, sifariş statusları. Hər bir bu variant adətən sabit bir dəyər ilə təmsil olunur. Bax, bu mövzuya yaxınlaşırıq — enum-lar (enum).

Enum — bu, adlandırılmış konstantlar dəstini elan etməyə imkan verən xüsusi data tipidir.
enum — sanki hüceyrələrə bölünmüş bir qutu kimidir, hər bir etiket — unikal ad, hansısa ədədlə bağlıdır.

  • Kodun oxunaqlıözünü sənədləşdirən olur;
  • 0, 1, 2 kimi anlaşılmaz “sehrli ədədlər” əvəzinə ifadəli adlar yaranır: DayOfWeek.Monday və ya TrafficLight.Red;
  • Əgər səhv dəyər verməyə çalışsan, kompilyator səni xəbərdar edəcək;
  • Hər bir elementin arxasında... sadə bir tam ədəd gizlənir! (Amma buna hələ qayıdacağıq.)

2. Enum elanının sintaksisi

Gəlin ilk enumumuzu yaradaq — hava tipləri üçün. Bu, belə görünəcək:


// Hava şəraiti üçün enum
public enum WeatherCondition
{
    Sunny,       // 0
    Cloudy,      // 1
    Rainy,       // 2
    Stormy,      // 3
    Snowy        // 4
}
WeatherCondition enum-unun elanı
  • enum açar sözü yeni tip təyin edir.
  • Əyri mötərizələrdə — variantların adları. Susmaya görə hər bir varianta sıfırdan başlayaraq tam ədəd verilir (Sunny == 0, Cloudy == 1 və s.).
  • Dəyərləri açıq şəkildə vermək də olar:
public enum WeatherCondition
{
    Sunny = 1,
    Cloudy = 2,
    Rainy = 4,
    Stormy = 8,
    Snowy = 16
}

Əgər dəyərlər hansısa xarici standartlara və ya protokollara uyğun olmalıdırsa, bu çox rahatdır.

3. Enum-lardan istifadə

Təsəvvür et ki, bir proqram yazmısan — kiçik konsol tətbiqi, hansı ki, havaya reaksiya verir.

// Tətbiq klası
class Program
{
    static void Main()
    {
        // Havanın vəziyyətini saxlamaq üçün enum-dan istifadə edirik
        WeatherCondition todayWeather = WeatherCondition.Sunny;

        // Ekrana çıxarırıq
        Console.WriteLine($"Bugünkü hava: {todayWeather} ({(int)todayWeather})");

        // İndi isə havanın dəyişməsini simulyasiya edirik
        todayWeather = WeatherCondition.Rainy;
        Console.WriteLine($"Aha! Hava dəyişdi: {todayWeather} ({(int)todayWeather})");
    }
}

Nə baş verəcək?


Bugünkü hava: Sunny (0)
Aha! Hava dəyişdi: Rainy (2)
  • todayWeather — bu sətir deyil, ədəd deyil, enum elementidir.
  • (int) tipinə çevirmə ilə həmin dəyərin “ədədi” kodunu görə bilərsən.

Yeri gəlmişkən, enum-lar şərtlərlə əla işləyir:

if (todayWeather == WeatherCondition.Rainy)
    Console.WriteLine("Çətir götür!");

4. enum üçün praktik ssenarilər

Enum-lar harada rast gəlinir?

  • Biznes tətbiqlərində: sifariş statusları (New, Processing, Shipped, Cancelled).
  • İstifadəçi idarəetmə sistemlərində: giriş səviyyələri (User, Moderator, Admin).
  • Oyunlarda: personaj vəziyyətləri (Idle, Moving, Jumping, Falling).
  • GUI-də: düymələr, mesajlar, ikon rəngləri.

.NET-də isə — demək olar ki, hər ikinci standart kitabxana klasında enum tapacaqsan! Məsələn, fayl əməliyyatlarında fayl açma rejimini göstərmək üçün enum-lar var (oxuma, yazma, yaratma və s.).

5. Açıq dəyərlər və dəyər aralığı

Bəzən kodda istifadə olunan int dəyərlərini enum-a çevirmək istəyirsən. Bunu etmək çox asandır:


public enum CompassDirection
{
    North = 10,
    East = 20,
    South = 30,
    West = 40
}
Açıq dəyərlərlə enum

İndi CompassDirection.North = 10, East = 20 və s. Əgər hansısa elementin dəyəri açıq göstərilməyibsə, avtomatik olaraq əvvəlkindən +1 alır.

Saxlama tipi

Susmaya görə enum int (4 baytlıq tam ədəd) kimi saxlanılır. Amma yaddaşa qənaət etmək istəyirsənsə, öz bazis tipini göstərə bilərsən:

public enum TinyEnum : byte
{
    First,  // 0
    Second, // 1
    Third   // 2
}

İndi hər bir enum dəyəri cəmi bir baytdır!

Mümkün tiplərin tam siyahısı: byte, sbyte, short, ushort, int, uint, long, ulong.

6. enum və ədəd/sətir arasında çevirmə

enumint çevirmə:

Enum-u int-ə və əksinə çevirmək üçün sadəcə typecast istifadə edə bilərsən:

WeatherCondition current = WeatherCondition.Cloudy;
int number = (int)current; // 1 alırıq

WeatherCondition fromNumber = (WeatherCondition)2; // Rainy alırıq

enumstring çevirmə:

Enum-u sətirə çevirmək asandır: sadəcə ToString() metodunu çağırırsan.

// Enum-u sətirə çeviririk
string name = WeatherCondition.Stormy.ToString(); // "Stormy"

// Sətiri enum-a çevirmək üçün Enum.Parse istifadə edirik
WeatherCondition parsed = (WeatherCondition)Enum.Parse(typeof(WeatherCondition), "Stormy");

// Həmçinin Enum.TryParse istifadə etmək olar
WeatherCondition parsedOk;
if (Enum.TryParse("Snowy", out parsedOk))
{
    Console.WriteLine(parsedOk); // Snowy
}

Tipik səhv:
Əgər ədədi enum-a çevirsən və belə bir üzv yoxdursa, kompilyator xəbərdarlıq etməyəcək, amma “virtual” vəziyyət alacaqsan.
Məsələn:

WeatherCondition weird = (WeatherCondition)999;
Console.WriteLine(weird); // 999 (bu "Unknown" olmayacaq!)

Yəni, belə çevirmələrdə proqramçı diqqətli olmalıdır.

7. switchenum bir-biri üçün yaradılıb

Enum-lar (enum) switch operatoru ilə əla işləyir. Bu, enum dəyərlərinə “reaksiya vermək” üçün rahat və aydın üsuldur — uzun “if-else” əvəzinə.

Nümunə: havaya reaksiya

public enum WeatherCondition
{
    Sunny,
    Cloudy,
    Rainy,
    Stormy,
    Snowy
}

WeatherCondition today = WeatherCondition.Rainy;

switch (today)
{
    case WeatherCondition.Sunny:
        Console.WriteLine("Günəşli! Gəzintiyə çıxmaq olar.");
        break;
    case WeatherCondition.Cloudy:
        Console.WriteLine("Buludlu. Kofta götürmək olar.");
        break;
    case WeatherCondition.Rainy:
        Console.WriteLine("Yağış yağır. Çətiri unutma!");
        break;
    case WeatherCondition.Stormy:
        Console.WriteLine("Fırtına! Yaxşısı evdə qal.");
        break;
    case WeatherCondition.Snowy:
        Console.WriteLine("Qar yağır — papaq tax!");
        break;
    default:
        Console.WriteLine("Naməlum hava...");
        break;
}
  • Hər bir case enum-un bir dəyərinə uyğundur.
  • Əgər dəyər heç bir məlum variantla uyğun gəlmirsə, default işləyir (bu, dəyişkənə gözlənilməz nəsə düşəndə faydalıdır).

Enum + switch nəyə görə yaxşıdır?

  • Kod oxunaqlıdır: bütün mümkün variantlar case siyahısında görünür.
  • Genişləndirmək rahatdır: yeni hava tipi əlavə etdin — sadəcə yeni case əlavə et.
  • Təhlükəsizlik: kompilyator xəbərdarlıq edəcək ki, bütün variantları emal etməmisən (C# 8.0-dan tam yoxlama da açmaq olar).

Nümunə: oyun üçün enum və məntiq

public enum GameState
{
    Start,
    Playing,
    Paused,
    GameOver
}

void PrintState(GameState state)
{
    switch (state)
    {
        case GameState.Start:
            Console.WriteLine("Oyuna xoş gəlmisən!");
            break;
        case GameState.Playing:
            Console.WriteLine("Oyun gedir. Uğurlar!");
            break;
        case GameState.Paused:
            Console.WriteLine("Fasilə. Dincələ bilərsən.");
            break;
        case GameState.GameOver:
            Console.WriteLine("Oyun bitdi. Yenidən yoxla!");
            break;
        default:
            Console.WriteLine("Naməlum oyun vəziyyəti.");
            break;
    }
}

Məsləhətlər:

  • Əgər bir neçə variant üçün eyni hərəkət lazımdırsa, onları birləşdirə bilərsən:
switch (today)
{
    case WeatherCondition.Rainy:
    case WeatherCondition.Stormy:
        Console.WriteLine("Çətir və isti geyim götür!");
        break;
}
  • default hissəsini unutma ki, gözlənilməz dəyərləri də emal edəsən (məsələn, kimsə ədədi enum-a çevirib).
  • switch ilə “state machine”, menyu və sabit variantlı istənilən sistemi qurmaq rahatdır.

8. Enum-lar və əsas .NET metodları/xidmətləri

.NET enum-lar üçün bir dəstə faydalı metod verir:

  • Enum.GetNames(typeof(WeatherCondition)) — bütün adları al.
  • Enum.GetValues(typeof(WeatherCondition)) — bütün dəyərlər.
  • Enum.IsDefined(typeof(WeatherCondition), "Rainy") — enum-da belə üzv var, ya yox.
  • Sənəd: System.Enum

Bütün hava variantlarını çıxarma nümunəsi:

foreach (var name in Enum.GetNames(typeof(WeatherCondition)))
{
    Console.WriteLine(name);
}

9. Tez-tez rast gəlinən səhvlər və “tələlər”

  • “Sehrli ədədlər”dən istifadə edirlər, enum-lardan yox, oxunaqlıq itir.
  • Enum-da təyin olunmayan dəyərləri emal etmirlər (ədədi enum-a çevirmə məsələsinə bax).
  • Enum elementlərini mənasız adlandırırlar (Value1, Value2... — və artıq heç kim bilmir bu nədir).
  • Bir enum-da müxtəlif şeyləri qarışdırırlar — yəni tək məsuliyyət prinsipini pozurlar.

Ən yaxşı həll: həmişə enum istifadə et, əgər sonlu variantlar varsa və elementlərə mənalı, özünü izah edən adlar ver.

Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION