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ı və ö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
}
- 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
}
İ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ə
enum ↔ int ç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
enum ↔ string ç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. switch və enum 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.
GO TO FULL VERSION