Numaralandırmalar hakkında biraz okuma yapıyordum ve onları sabitleri bildirmeye çok benzer buldum. Ne zaman bir sabit listesi yerine sabit kullanacağımı veya tam tersini nasıl bilebilirim? Numaralandırma kullanmanın bazı avantajları nelerdir?
Numaralandırmalar hakkında biraz okuma yapıyordum ve onları sabitleri bildirmeye çok benzer buldum. Ne zaman bir sabit listesi yerine sabit kullanacağımı veya tam tersini nasıl bilebilirim? Numaralandırma kullanmanın bazı avantajları nelerdir?
Yanıtlar:
Bir şeyin olabileceği bir değer aralığı tanımlamak istediğinizde numaralandırmaları kullanın. Renk, aşağıdaki gibi bariz bir örnektir:
public enum Colour
{
White,
Red,
Blue
}
Ya da belki bir dizi olası şey: (Örnek , tembel olduğum için buradan çaldım )
[FlagsAttribute]
enum DistributedChannel
{
None = 0,
Transacted = 1,
Queued = 2,
Encrypted = 4,
Persisted = 16,
FaultTolerant = Transacted | Queued | Persisted
}
Sabitler, PI gibi tek bir değer için olmalıdır. Bir dizi PI değeri yoktur, sadece PI vardır.
Dikkate alınacak diğer noktalar şunlardır:
Type Safety"
Diğer yanıtlarda eksik olan, numaralandırmaların bir tamsayı temel türüne sahip olmasıdır. Varsayılanı int'ten başka bir integral türüne değiştirebilirsiniz, örneğin char dışında:
enum LongEnum : long {
foo,
bar,
}
Temel türden açıkça ve dolaylı olarak temel türe çevirebilirsiniz, bu anahtar deyimlerinde kullanışlıdır. Numaralandırmanın uygun değere sahip bir üyesi olmasa bile, temel türün herhangi bir değerini bir numaralandırmaya çevirebileceğine dikkat edin. Bu nedenle, bir anahtarda her zaman varsayılan bölümü kullanmak iyi bir fikirdir. BTW, .NET'in kendisi kayan nokta değerli numaralandırmalara bile izin verir, ancak bunları C # ile tanımlayamazsınız, ancak yine de kullanabileceğinizi düşünüyorum (switch hariç).
Ayrıca, numaralandırmaları kullanmak size daha fazla tür güvenliği sağlar. Yöntem parametreleri olarak örneğin int sabitlerini kullanmayı düşünüyorsanız, yöntemi herhangi bir int değeriyle çağırabilirim. Kabul edilirse, döküm yoluyla numaralandırmalarla da olabilir, ancak yanlışlıkla olmaz. Daha da kötüsü, parametrelerin sırasını karıştırma olasılığıdır.
void method(int a, int b) {...}
Sabit A yalnızca a'ya gidebiliyorsa ve sabit B yalnızca b'ye girebiliyorsa, iki farklı enum türü kullanmak derleme sırasında herhangi bir yanlış kullanımı ortaya çıkaracaktır.
Sabit, değişkenin değeri değiştirmeyeceğini söyleyen bir dil özelliğidir (böylece derleyici bu bilgi etrafında optimizasyonlar yapabilir), burada enum belirli bir türdür.
Sabitler herhangi bir veri türü olabilir, ancak bir enum bir numaralandırmadır.
Bir dizi seçeneğinizin olabileceği ve kodun okunabilirliğini artırmak istediğiniz her yerde bir sıralama kullanıyorum. yani, 0, 1, 2 değerlerine sahip bir int olarak veya hata, uyarı ve bilgi olarak bir enum olarak izleme düzeylerine sahip olabilirsiniz.
Enum'lar ayrıca bitsel işleçler olarak kullanılabilir, yani FontStyle.Bold | FontStyle.Italic size kalın ve italik yazı tipleri verir.
Robert'ın cevabına ek olarak:
Sonlu bir adlandırılmış değerler kümesi için enum kullanın. Her bir sembolün ardındaki sayısal değeri gerçekten önemsemezsiniz (ancak yine de onları empoze etme yeteneğine sahipsiniz, örneğin eski bir sistemle uyumluluk için).
Robert: Evet, Enum'lar bit alanları olarak kullanılabilir. Flags özniteliğini kullanın (ve numaralandırmanın üyelerinin uygun sayısal değerlere sahip olduğundan emin olun).
AC # sabiti, bir değere tanımlı bir ad vermesi açısından değişkene benzer. Bununla birlikte, bir sabit standart değişkenden farklıdır, çünkü bir kez tanımlandıktan sonra sabite atanan değer asla değiştirilemez. Sabitlerin başlıca faydası, kendi kendini belgeleyen kod oluşturmadaki yardımlarının yanı sıra anahtar değerlerin tek bir yerde beyan edilmesine izin vermesidir; bu, değerin güncellenmesi ve yazılımın yeniden derlenmesi gerektiğinde kolay bakıma izin verir.
Oysa Numaralandırıcı listeleri, özellikle bu durumlar boyunca doğal bir ilerleme olduğunda, dizileri ve durumları tanımlamak için yararlıdır. Bunun nedeni, listedeki her sabitin adı veya değeri kullanılarak biçimlendirilip karşılaştırılabilmesidir. Sınırlı bir geçerli değerler kümesini tanımlamak için bir enum da kullanılabilir.
Kullanmak enum
yerine kullanırken kullanışlı bulduğum bir şey const
, bir içindeki değerleri yineleyebilmenizdir enum
, bunu const
değerlerle yapmak çok daha zordur .
Tamsayı tabanlı değerlere ihtiyacınız varsa numaralandırmaları kullanın. Dizge tabanlı değerlere ihtiyacınız varsa, Sabitler ile yapıları kullanın.
Gibi bir şeye sahip olduğun zaman
class x
{
public string string_value {get;set;}
publi int int_value {get;set;}
}
x model = new x();
model.string_value = struct.some_value;
model.int_value = enum.some_value;