C Sharp Programlama Dili/Enum sabitleri
Enum sabitleri sayesinde bazı özel sözcüklerin bazı tam sayıları temsil etmesini sağlayabiliriz. En genel enum bildirimi şu şekilde yapılır:
enum AD : tur{SOZCUK1,SOZCUK2}
Bu bildirimde enum sabitinin adı AD
dır. tur
ise sözcüklerin hangi türden sabitleri temsil edeceğini belirtir. Parantez içindeki sözcükler ise herhangi bir sabiti temsil etmesini istediğimiz sözcüklerdir. Parantez içine en fazla türün kapasitesi kadar sözcük girilebilir. Örneğin tur
yerine byte yazmışsak en fazla 255 tane sözcük girebiliriz.
enum AD{SOZCUK1,SOZCUK2}
Burada bir tür belirtmediğimiz için otomatik olarak tür int olur. Enum sabitlerinin türünü byte, sbyte, short, ushort, int, uint, long ve ulong türlerinden biri yapabiliriz. Şimdi enum sabitleriyle ilgili bir örnek yapalım. Örneğimizde bir metot kendisine ilk parametre olarak gönderilen dizinin elemanlarını ekrana yazsın. Metodun ikinci parametresinde de dizinin elemanlarının ekrana nasıl yazılacağı ayarlansın. Eğer ikinci parametre YANINA
olarak girilirse dizinin elemanları ekrana yan yana yazılsın. Eğer ikinci parametre ALTINA
olarak girilirse dizinin elemanları ekrana alt alta yazılsın:
using System;
enum BICIM : byte{YANINA,ALTINA}
class Program
{
static void DiziYaz(Array dizi,BICIM b)
{
if(b==BICIM.YANINA)
{
foreach(object o in dizi)
Console.Write(o.ToString()+" ");
Console.WriteLine();
}
else
foreach(object o in dizi)
Console.WriteLine(o);
}
static void Main()
{
int[] a=new int[10];
DiziYaz(a,BICIM.YANINA);
DiziYaz(a,BICIM.ALTINA);
}
}
Şimdi başka bir örnek:
using System;
enum not:byte{basarisiz,gecmez,gecer,orta,iyi,pekiyi}
class Program
{
static void Main()
{
Console.Write("Lütfen notunuzu giriniz: ");
not a=(not)Convert.ToByte(Console.ReadLine());
Console.WriteLine(a);
}
}
Bu program ekrana kullanıcı 0 girerse basarisiz
, 1 girerse gecmez
, 2 girerse gecer
, 3 girerse orta
, 4 girerse iyi
ve 5 girerse pekiyi
yazmaktadır. Eğer kullanıcı 5'ten büyük bir sayı girerse sayıyı yazacaktır. Enum sözcüklerinin verilen türe göre temsil ettikleri bir tam sayı vardır. Biz enum sabitini tanımlarken herhangi bir ek düzenleme yapmadığımız için ilk sözcük 0'ı temsil eder. Diğer sözcükler de birer artarak kendi sayılarını temsil eder. Yani aşağıdaki tablo söz konusudur:
Sözcük | Temsil ettiği sayı |
---|---|
basarisiz | 0 |
gecmez | 1 |
gecer | 2 |
orta | 3 |
iyi | 4 |
pekiyi | 5 |
Ayrıca gördüğünüz gibi programımızda byte türünü not türüne (enum sabitine) bilinçli olarak dönüştürdük. Bilinçsiz olarak dönüştüremezdik. Ayrıca direkt olarak stringten nota dönüşüm yapamazdık. Şimdi başka bir program:
using System;
enum not:byte{basarisiz,basarili}
class Program
{
static void Main()
{
not a=not.basarili;
if(a==(not)1)
Console.Write("Başarılısınız");
else
Console.Write("Başarısızsınız");
}
}
Burada da int türü not türüne bilinçli olarak dönüştürüldü. Başka bir örnek:
using System;
enum not:byte{basarisiz,basarili}
class Program
{
static void Main()
{
Console.Write(not.basarisiz);
}
}
Bu programda ekrana basarisiz
yazılır. Yani enum sözcükleri direkt kullanılmak istendiğinde yalnızca sözcük kullanılıyor. Başka bir örnek:
using System;
enum not:byte{basarisiz,basarili}
class Program
{
static void Main()
{
not a=not.basarisiz;
byte b=(byte)a;
Console.Write(b);
}
}
Burada da not türü byte'a bilinçli olarak dönüştürüldü.
ÖZET: Enum tipi ile enum'un baz tamsayı tipi arasında bilinçli tür dönüşümü yapılabilir, bilinçsiz tür dönüşümü yapılamaz.
NOT: Özetteki kuralın istisnası 0'dır. 0, ilgili enum tipine bilinçsiz olarak dönüşebilir. Örnek:
enum BICIM{DIKEY, YATAY}
class Sinif
{
static void Main()
{
BICIM b=0; //b'ye DIKEY atandı.
}
}
Ancak tersine dönüşüm mümkün değildir. Yani burada b değişkeni, int'e bilinçsiz olarak dönüşemez.
Eğer iki sözcüğe aynı tam sayıyı vermişsek bu iki sözcük birbirine eşit sayılır. Birinin yerine diğeri kullanılabilir. Örnek:
using System;
enum BICIM { DIKEY=6,YATAY=6}
class AnaProgram
{
static void Main()
{
BICIM b = BICIM.DIKEY;
BICIM b2 = BICIM.YATAY;
Console.WriteLine(b == b2);
}
}
Bu program ekrana "TRUE" çıktısını verir.
Enum sıra numaralarını değiştirme
değiştirenum not:byte{basarisiz,basarili}
satırında sözcükler 0'dan başlayarak birer birer artarak bir tam sayıyı temsil eder. Ancak hangi sözcüğün hangi tam sayıyı temsil ettiğini kendimiz belirtebiliriz. Örnekler:
enum not:byte{basarisiz=6,basarili=10}
Bu örnekte basarisiz 6'yı, basarili 10'u temsil eder. Bir tam sayı birden fazla sözcüğe verilebilir.
enum not:byte{basarisiz=6,basarili}
Bu örnekte basarisiz 6'yı, basarili 7'yi temsil eder.
enum not:byte{basarisiz,gecmez=5,gecer,orta,iyi=2,pekiyi}
Bu örnekte ise şu temsiller söz konusudur:
Sözcük | Temsil ettiği sayı |
---|---|
basarisiz | 0 |
gecmez | 5 |
gecer | 6 |
orta | 7 |
iyi | 2 |
pekiyi | 3 |
enum not:byte{basarisiz=-21,basarili}
Bu örnekte basarisiz
-21'i basarili
-20'yi temsil eder.
NOT: Bir enum değişkenine enumda olmayan bir sözcüğün sayı karşılığı dönüşüm operatörünü kullanmak şartıyla atanabilir.
NOT: Enum değişkenlerinin varsayılan değeri 0 değerinin ilgili enum tipine çevrilmiş halidir. Örnek:
using System;
enum deneme { Ahmet }
class Deneme
{
static void Main()
{
deneme d = new deneme();
Console.WriteLine(d);
}
}
Bu program ekrana "Ahmet" çıktısını verir.
System.Enum sınıfı
değiştirSystem.Enum sınıfı enum sabitleriyle kullanılabilecek çeşitli üye elemanlara sahiptir. Burada yalnızca GetNames()
metodu tanıtılacaktır. GetNames()
metodu bir enum sabitinin tüm sözcüklerini string türündeki bir dizi olarak tutar. Örnek:
using System;
enum Gunler:byte
{
PAZARTESI,
SALI,
CARSAMBA,
PERSEMBE,
CUMA,
CUMARTESI,
PAZAR
}
class Sinif
{
static void Main()
{
string[] a=Gunler.GetNames(typeof(Gunler));
Console.WriteLine(a[0]);
//veya
Console.WriteLine(Gunler.GetNames(typeof(Gunler))[3]);
}
}
Bu örnek ekrana alt alta PAZARTESI
ve PERSEMBE
yazar.
NOT: Enum sabitine isim verirken ve enum sözcüklerini yazarken değişken adlandırma kurallarının tamamına uymalıyız.