Giriş
System.Enum soyut bir sınıftır. Kalıtım hiyerarşisi şöyledir.
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.
Örnek
Laç tane enum olduğu bulmak için şöyle yaparız.
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
Eğer istenirse IEnumerator de kullanılabilir ancak yukarıdaki örneğe göre hiç bir avantajı yok
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.
Bir diğer açıklama şöyle.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 .
Kalıtım IL seviyesinde görülebilir. Elimizde şöyle bir enum olsun.The enumeration does not explicitly inherit from Enum; the inheritance relationship is handled implicitly by the compiler.
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 metoduEnum'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)))
ÖrnekEğ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.
Enum'un ismine veya değeriner göre arama yapabilmeyi sağlar.
Örnek
Elimizde şöyle bir kod olsun.
String'den enum alabilmemizi sağlar.
Enum'un ismini string olarak verir.
Örnek
Elimizde şöyle bir kod olsun.
Şö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 metoduEnum'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 metoduString'den enum alabilmemizi sağlar.
var enumValue = Enum.Parse(typeof(MyEnum), "...", true); //true = ignore case
ToString metoduEnum'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ızforeach(var flow in Enum.GetValues(typeof(Flow)))
{
Console.WriteLine (flow.ToString ());
}
Hiç yorum yok:
Yorum Gönder