enum TÜRLERİ ve enum SABİTLERİ

Bazen kısıtlı sayıda seçenek sözkonusudur ve bu seçeneklerin ifade edilmesi gerekmektedir. Bunun için yazıları kullanmak ( yani string kullanmak ) okunabilir olsa da iki dezavantajı vardır:

Yazılar yanlış yazılmaya müsaaittir ve yazı işlemleri göreli olarak yavaştır. Örneğin bir oyun programında bir şekle yukarı,sağ, aşağı ya da sola hareket ettiren move isimli bir metot yazacak olalım. metodun parametresi string olsun.

biz bu metodu şöyle yazabniliriz .string yerine int gibi tamsayılar kullanılabilir. Fakat bu durumda da koda bakan kişi ve hatta kofu yazan kişi şeklin hangi yöne gideceği yönde tereddüt yaşar.

Haftanın günleri, yılın ayları, renkler , ülkeler, şehirler hep kısıtlı sayıa seçeneğe sahip kümelerdir. O halde bizim yazıyla temsil edilen fakat gerçekte sayı belirten türlere gereksinimimiz vardır. İşte enum bunun için kullanılmaktadır. enum bildiriminin genel biçimi şöyledir.

Sabit listesi virgüllerle ayrılan isimlerden oluşur. Bunlara enum sabitleri denir.

Up, Right,Down,Left aslında yazı kılığına bürünmüş sayılardır.İlk enum sabitinin sayısal değeri sıfırdır sonrakiler de bir öncekinin bir fazlasıdır.Fakat istenirse bir enum sabitine = atomu ile bir değer verilebilir. Böylece sonrakiler onu izler. Örneğin;

Burada up =0 right =3 down =4 ve left =-5 tir.

Bir enum sabiti dışardan doğrudan kullanılamaz , enum ismi ve nokta operatörü ile kullanılr. Örneğin direction.up ve direction.down gibi. enum sabitleri erişim belirleyicilerine sabit değildir defaul publictir. Her enum türü farklı bir türdür.Aynı türden iki enum birbirine atanabilir.enum sabitleri de o enum türündendir .Örneğin;

Burada c ve colors.Green aynı türdendir. enum türlerinden temel türleretemel türlerden de enum türlere doğrudan dönüştürme yoktur.

Genellikle programcılaer özxel bir durum yoksa enum türnden sdabitlerini sayısaldeğerleriyle ilgilenmezler. Bu durumda onların sayısal değerleri tişleme sokulur.

Direction.Down > direction.up true değeri verir. enum değeri switch işlemine sokulabilir. Tabii bu durumda case ifadeleri de aynı türden enum olmak zorundadır.
Böylece yukarıda sözü edilen move metodu şöyle yazılabilir.

Bu durumda metodu şöyle çağırmalıyız.

Bir enum değerini Console sınıfının Write ve WriteLine metotlarıyla yazdırırsak onların sayısal karşılıkları değil yazısal karşılıkları ekrana basılır.

Örneğin Date Time yapısının DayOfWeek isimli property elemanı DayOfWeek türünden bir enum türündendir. DayOfWeek isimli enum türünün Sunday, Monay, Tuesday, Wednesday ,Thursday,Friday, ve Saturday elemanları vardır. Şüphesiz çok çeşitli enumlar da vardır.

Datetime isimli yapının “Dayofweek” isimli property elemanı “Dayofweek” isimli enum türündendir. Bu enum türünün haftanın günlerini belirten “Sunday, Monday, … “ isimli elemanları vardır.

***Anahtar Notlar: Bir sınıf yada yapının bir elemanının ismiyle onun türünün ismi aynı olabilir. Bu durumda bu isim dışarıdan niteliksiz olarak kullanıldığında tür ismi, nitelikli olarak kullanıldığında eleman ismi anlaşılır.

Örneğin:

Bir enum türü içerisinde aynı değere sahip birden fazla enum sabiti bulunabilir.

Örneğin:

Enum türleri Kategori olarak değer türlerindendir. Yani bir enum türünden bir değişken bildirdiğimizde biz değerin kendisini tutan bir değişken bildirmiş oluruz.

Her enum türünün ilişkin olduğu bir tam sayı türü vardır. (underlying integer type) İlişkin olduğu tam sayı türü enum isminden sonra “: “ syntax’ ı ile belirtilir. Eğer enum türünün ilişkin olduğu tam sayı türü belirtilmezse “: int” belirlemesi yapılmış gibi işlem görür.

Enum türünün ilişkin olduğu tam sayı türü o enum türünden değişkenin bellekte kaç byte yer kaplayacağını belirlemektedir.

Bir enum türünün enum sabitleri onun ilişkin olduğu tam sayı türünün sınırları dışında değer alamaz.

Örneğin:

Enum türünden tam sayı türlerine tam sayı türlerinden de enum türlerine tür dönüştürme operatörleriyle dönüşüm yapılabilir.

Örneğin:

Bir enum türünden değişkene atanacak değerin bir enum sabitiyle temsil edilmesi zorunlu değildir.
Örneğin:

Anahtar Notlar: konsol sınıfının write ve writeline methodları ile bir enum değeri yazdırılırken eğer bu değer bir enum sabitiyle temsil ediliyorsa o sabitin yazısı yazdırılır. Temsil edilmiyorsa sabitin sayısal değeri yazdırılır.

Bir enum türünden de tamsayı türlerine tür dönüştürme operatörleriyle dönüşüm yapılabilir.

Örneğin:

Enum türleriyle temel türler arasında dönüşüm yapılırken, adeta enum türleri ilişkin olunan tam sayı türüymüş gibi işleme sokulur. Yani örneğin bir enum türünün ilişkin olduğu tam sayı türü “byte” türü olsun:

İşte biz bu enum türüne farklı bir tam sayı türünü tür dönüştürerek atayabiliriz;

Burada int türünden byte türüne dönüşüm yapılıyormuş gibi işlem yapılır. Yani sayının yüksek anlamlı byteları kaybedilir. Aynı durumun terside söz konusudur:

Farklı türlerden iki enum birbirine doğrudan atılamaz. Yani aralarında doğrudan dönüştürme yoktur. Fakat tür dönüştürme operatörüyle bir enum diğerine dönüştürülebilir.

“E” bir enum türü, “T” bu enum türünün ilişkin olduğu tam sayı türü olsun. “e” “E” türünden, “x” de “T” türünden yada bu türe doğrudan dönüştürülebilen bir türden olsun.

1. Bir enum türüyle bir tam sayı türü toplanabilir. Sonuç enum türünden çıkar.Yani “e+x” geçerlidir. Bu işlemin sonucu ( E )(( T ) e + ( T ) x ) ifade biçimindedir.

2. Bir enum türünden bir tam sayı türü çıkartılabilir. Sonuç enum türünden çıkar. Yani “e – x” işlemi geçerlidir. Bu işlemlin eş değeri ( E )(( T )e – ( T ) x) biçimindedir.
3. Bir enum türü “++” ve “—“ operatörleriyle işleme sokulabilir ve tam sayı türleriyle “+=” ve “-=” operatörleriyle işleme sokulabilir.
4. “e+x” işlemi “x+e” işlemiyle eşdeğerdir. Fakat “e-x” geçerli olduğu halde “x-e” geçerli değildir.
5. Aynı türden iki enum “-“ operatörüyle işleme sokulabilir. Sonuç ilişkin olunan tam sayı türünden çıkar yani; “e1” ve “e2” “E” türünden olmak üzere “e1-e2” ( T )e1 – ( T )e2 işlemiyle eşdeğerdir. Aynı türden iki enum birbirleriyle toplanamaz.

Kaynak:Kaan Aslan Hocanın Dersinde Tuttuğum Ders Notlarıdır.

Leave a Reply

Site Footer