Numaralandırma Türleri (C# Programlama Kılavuzu)
Bir numaralandýrma türü (ya da bir numaralandırma enum da adlandırılan) bir değişkene atanabilecek ayrılmaz adlandırılmış sabitler kümesini tanımlamak için etkili bir yöntem sağlar.Örneğin, değeri haftanın gününü temsil eden bir değişken tanımlamak zorunda olduğunuz varsayılmaktadır.Şimdiye kadar bu değişkene depolar yalnızca yedi anlamlı değerler vardır.Bu değerler tanımlamak için kullanarak bildirilen bir numaralandırma türü kullanabilirsiniz enum anahtar sözcük.
enum Days { Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday };
enum Months : byte { Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec };
Varsayılan olarak her öğe numaralandırma, temel türüdür int.Başka bir tamsayı sayısal türü, iki nokta kullanarak önceki örnekte gösterildiği gibi belirtebilirsiniz.Olası türlerinin tam listesi için bkz: (C# başvuru) enum.
Aşağıdaki örnekte gösterildiği gibi temel türüne çevrim temelindeki sayısal değerlerini doğrulayabilirsiniz.
Days today = Days.Monday;
int dayNumber =(int)today;
Console.WriteLine("{0} is day number #{1}.", today, dayNumber);
Months thisMonth = Months.Dec;
byte monthNumber = (byte)thisMonth;
Console.WriteLine("{0} is month number #{1}.", thisMonth, monthNumber);
// Output:
// Monday is day number #1.
// Dec is month number #11.
Bir sayısal tür bir enum kullanmanın yararları şunlardır:
Açıkça değişken için geçerli değerlerdir istemci kodu belirtin.
İçinde Visual Studio, IntelliSense tanımlanmış değerleri listeler.
Numaralandırıcı listeden öğelerin değerlerini belirtmezseniz, değerler 1 ile otomatik olarak artırılır.Önceki örnekte, Days.Sunday değeri 0, Days.Monday 1 vb. değerine sahiptir.Yeni bir oluşturduğunuzda Days nesne, varsayılan değeri olacaktır Days.Sunday , açıkça ona bir değer atamazsanız (0).Bir enum oluşturduğunuzda, en mantıklı varsayılan değer seçin ve sıfır değerini atayın.Oluşturuldukları sırada onlar açıkça bir değer atanmamış olan bu varsayılan değerine sahip tüm Numaralamalarda neden olur.
Değişken meetingDay türü Days, sonra da (explicit cast), yalnızca onu tanımlanan değerlerden birini atayabilirsiniz Days.Ve toplantı günü değişirse arasında yeni bir değer atamak için Days için meetingDay:
Days meetingDay = Days.Monday;
//...
meetingDay = Days.Friday;
[!NOT]
Herhangi bir rasgele tamsayı değeri atamak mümkün meetingDay.Örneğin, bu kod satırı, bir hata üretmez: meetingDay = (Days) 42.Örtülü beklentisiyle bir numaralandırma değişkeni yalnızca numaralandırma tarafından tanımlanan değerlerden birini tutmak, çünkü ancak, bunu kullanmayın.Bir numaralandýrma türü bir değişken için rasgele bir değer atamak için hatalar için yüksek bir risk tanıtmak sağlamaktır.
Bir numaralandırma türünün numaralayıcı listesindeki öğeler için herhangi bir değer atayabilirsiniz ve hesaplanan değerler de kullanabilirsiniz:
enum MachineState
{
PowerOff = 0,
Running = 5,
Sleeping = 10,
Hibernating = Sleeping + 5
}
Numaralandırma türleri olarak Bit işaretleri
Bir numaralandırma türü bit bayrakları tanımlamak için numaralayıcı listesinde tanımlanan değerlerin herhangi bir bileşimi depolamak için numaralandırma türünün bir örneğini sağlayan kullanabilirsiniz.(Kuşkusuz, bazı birleşimleri anlamlı veya program kodunda izin verilen olmayabilir.)
Bir bit bayrakları enum uygulayarak oluşturmak FlagsAttribute özniteliği ve değerleri gerektiği gibi tanımlama böylece AND, OR, NOT ve XOR üzerinde Bitsel işlemler gerçekleştirilebilir."Bayrak ayarlanır." anlamına gelir sıfır değeri olan bir adlandırılmış sabit bir bit bayrakları enum içindeki dahil "Bayrak Ayarla" gelmez, sıfır bir bayrak vermeyin.
Aşağıdaki örnekte, başka bir sürümü Days adlı bir enum, Days2, tanımlanır.Days2var Flags öznitelik ve her değer 2'in bir sonraki büyük güç atanır.Bu oluşturmanızı sağlayan bir Days2 değişken, değeri olan Days2.Tuesday ve Days2.Thursday.
[Flags]
enum Days2
{
None = 0x0,
Sunday = 0x1,
Monday = 0x2,
Tuesday = 0x4,
Wednesday = 0x8,
Thursday = 0x10,
Friday = 0x20,
Saturday = 0x40
}
class MyClass
{
Days2 meetingDays = Days2.Tuesday | Days2.Thursday;
}
Bit seviyesinde bir bayrak üzerinde bir enum ayarlamak için kullanın OR aşağıdaki örnekte gösterildiği gibi işleci:
// Initialize with two flags using bitwise OR.
meetingDays = Days2.Tuesday | Days2.Thursday;
// Set an additional flag using bitwise OR.
meetingDays = meetingDays | Days2.Friday;
Console.WriteLine("Meeting days are {0}", meetingDays);
// Output: Meeting days are Tuesday, Thursday, Friday
// Remove a flag using bitwise XOR.
meetingDays = meetingDays ^ Days2.Tuesday;
Console.WriteLine("Meeting days are {0}", meetingDays);
// Output: Meeting days are Thursday, Friday
Belirli bir bayrağı ayarlanmış olup olmadığını belirlemek için bir bit seviyesinde kullanmak AND işlemi, aşağıdaki örnekte gösterildiği gibi:
// Test value of flags using bitwise AND.
bool test = (meetingDays & Days2.Thursday) == Days2.Thursday;
Console.WriteLine("Thursday {0} a meeting day.", test == true ? "is" : "is not");
// Output: Thursday is a meeting day.
Numaralandırma türleri ile tanımladığınızda göz önüne alınması gerekenler hakkında daha fazla bilgi için FlagsAttribute özniteliği için bkz: Enum.
Keşfedin ve numaralandırma değerleri işlemek için System.Enum yöntemlerini kullanma
Tüm numaralamalar örnekleridir Enum türü.Yeni sınıflardan türetilemez Enum, ancak onun yöntemleri hakkında bilgi bulmak ve bir enum örnek değerleri işlemek için kullanabilirsiniz.
string s = Enum.GetName(typeof(Days), 4);
Console.WriteLine(s);
Console.WriteLine("The values of the Days Enum are:");
foreach (int i in Enum.GetValues(typeof(Days)))
Console.WriteLine(i);
Console.WriteLine("The names of the Days Enum are:");
foreach (string str in Enum.GetNames(typeof(Days)))
Console.WriteLine(str);
Daha fazla bilgi için bkz. [AllMembers.T:System.Enum].
Bir uzantı yöntemini kullanarak bir enum için yeni bir yöntem de oluşturabilirsiniz.Daha fazla bilgi için bkz. Nasıl yapılır: Numaralandırma için Yeni bir Yöntem Oluşturma (C# Programlama Kılavuzu).
Özel Kitap bölüm
Değişkenler hakkında daha fazla bilgi , Visual C# 2010 başına