4 Nisan 2018 Çarşamba

Enum Sınıfı

Giriş
System.Enum soyut bir sınıftır. Kalıtım hiyerarşisi şöyledir.
public abstract class Enum : ValueType, 
    IComparable, IFormattable, IConvertible
Enum sınıfının metodlarının tamamı static'tir.

Derleyicinin Görevi
Açıklaması şöyle. Kendi kodladığımız tüm enum yapıları bu sınıftan kalıtır. Benzer bir yöntem kendi array sınıflarında da kullanılır.
The real power of enums in C# is that behind the scenes they are instantiated as structs derived from the base class, System.Enum. This means it is possible to call methods against them to perform some useful tasks. Note that because of the way the .NET Framework is implemented there is no performance loss associated with treating the enums syntactically as structs. In practice, once your code is compiled, enums will exist as primitive types, just like int and float .
Bir diğer açıklama şöyle.
The enumeration does not explicitly inherit from Enum; the inheritance relationship is handled implicitly by the compiler.
Kalıtım IL seviyesinde görülebilir. Elimizde şöyle bir enum olsun.
enum Color
{
    RED,
    GREEN,
    BLUE
}
IL olarak bakınca şunu görürüz. Hem kalıtım, hem de alanların public static olduğu görülebilir.
.class private auto ansi sealed WindowsFormsApplication1.Color
    extends [mscorlib]System.Enum
{
  // Fields
  .field public specialname rtspecialname int32 value__
  .field public static literal valuetype WindowsFormsApplication1.Color RED 
   = int32(0)
  .field public static literal valuetype WindowsFormsApplication1.Color GREEN 
   = int32(1)
  .field public static literal valuetype WindowsFormsApplication1.Color BLUE 
   = int32(2)

}
GetNames metodu
Enum isimlerini bir string dizisi olarak döndürür.
Örnek
Laç tane enum olduğu bulmak için şöyle yaparız.
enum MyEnum 
{
  foo = 1,
  bar = 2
}

var noOfEnums = Enum.GetNames(typeof(MyEnum)).Length;
GetValues metodu
Enum'ları bir dizi olarak döndürür. Böylece tüm enumların üzerinden döngüyle dönebilmemizi sağlar. Java'daki values() ile benzeşir.
Örnek
foreach ile dönmek için şöyle yaparız
foreach(Foos foo in Enum.GetValues(typeof(Foos)))
Örnek
Eğer istenirse IEnumerator de kullanılabilir ancak yukarıdaki örneğe göre hiç bir avantajı yok
IEnumerator algoEnumerator = Enum.GetValues(typeof(Algorithm)).GetEnumerator();
while (algoEnumerator.MoveNext())
{
  dropDownSortAlgorithms.Items.Add(algoEnumerator.Current);
}
HasFlag metodu
Şöyle bir enum olsun.
[Flags]
public enum MyColor 
{
    None    = 0,
    Red = 1,
    Green = 2,
    Blue = 4,
    Orange = 8
}
Bu enum bayraklarını bir değişkene atayalım.
var sum = MyColor.Red | MyColor.Green | MyColor.Blue;
Bayrağın atandığını şöyle kontrol ederiz.
foreach (MyColor value in Enum.GetValues(sum.GetType())) {
    if (sum.HasFlag(value)) {...}
}
IsDefined metodu
Enum'un ismine veya değeriner göre arama yapabilmeyi sağlar.
Örnek
Elimizde şöyle bir kod olsun.
public enum YourEnum : int
{
  Zero = 0,
  One = 1
}
Şöyle yaparız.
Console.WriteLine(Enum.IsDefined(typeof(YourEnum), 1)); //True
Console.WriteLine(Enum.IsDefined(typeof(YourEnum), "Zero")); //True
String verirsek enum ismine göre arama yapar. Şu kod false döner.
Console.WriteLine(Enum.IsDefined(typeof(YourEnum), 1.ToString())); //False
Parse metodu
String'den enum alabilmemizi sağlar.
var enumValue = Enum.Parse(typeof(MyEnum), "...", true); //true = ignore case
ToString metodu
Enum'un ismini string olarak verir.
Örnek
Elimizde şöyle bir kod olsun.
public enum Flow
{
    All = 0,
    One = 1
}
Şöyle yaparız. Çıktı olarak All ve One alırız
foreach(var flow in Enum.GetValues(typeof(Flow)))
{
  Console.WriteLine (flow.ToString ());
}

Hiç yorum yok:

Yorum Gönder