Numaralandırmalar kesinlikle kodu daha okunaklı hale getirebilir. Hala dikkat edilmesi gereken birkaç şey var (en azından .net içinde)
Bir numaralamanın temelindeki depolama bir int olduğundan, varsayılan değer sıfır olacaktır, bu nedenle 0'ın mantıklı bir varsayılan olduğundan emin olmalısınız. (Örneğin, yapıların tüm alanları oluşturulduklarında sıfıra ayarlanmıştır, bu nedenle 0 dışında bir varsayılan belirtmenin bir yolu yoktur. 0 değeriniz yoksa, int'e çevrim yapmadan sıralamayı bile test edemezsiniz. kötü stil.)
Numaranız kodunuza özelse (asla halka açık değilse), burada okumayı bırakabilirsiniz.
Senin Çeteleler ise yayınlanan harici koda hiçbir şekilde ve / veya programın dışında kaydedilir bunları açıkça numaralandırma düşünün. Derleyici bunları otomatik olarak 0'dan numaralandırır, ancak numaralandırmalarınızı değer vermeden yeniden düzenlerseniz, hatalarla sonuçlanabilirsiniz.
Yasal olarak yazabilirim
WriteMode illegalButWorks = (WriteMode)1000000;
file.Write( data, illegalButWorks );
Bununla mücadele etmek için, emin olamadığınız bir numaralandırmayı kullanan herhangi bir kodun (örneğin, genel API) numaralandırmanın geçerli olup olmadığını kontrol etmesi gerekir. Bunu şu yolla yaparsın
if (!Enum.IsDefined(typeof(WriteMode), userValue))
throw new ArgumentException("userValue");
Tek uyarı, Enum.IsDefined
yansımayı kullanması ve daha yavaş olmasıdır. Ayrıca bir sürüm oluşturma sorunu da yaşıyor. Enum değerini sık sık kontrol etmeniz gerekiyorsa, aşağıdakilerden daha iyi olursunuz:
public static bool CheckWriteModeEnumValue(WriteMode writeMode)
{
switch( writeMode )
{
case WriteMode.Append:
case WriteMode.OverWrite:
break;
default:
Debug.Assert(false, "The WriteMode '" + writeMode + "' is not valid.");
return false;
}
return true;
}
Sürüm oluşturma sorunu, eski kodun yalnızca sahip olduğunuz 2 numaralandırmayı nasıl işleyeceğini bilmesidir. Üçüncü bir değer eklerseniz, Enum.IsDefined doğru olacaktır, ancak eski kod bunu işleyemez. Whoops.
[Flags]
Numaralandırmalarla yapabileceğiniz daha da fazla eğlence var ve bunun için doğrulama kodu biraz farklı.
Ayrıca taşınabilirlik için call ToString()
on the enum kullanmanız Enum.Parse()
gerektiğini ve bunları tekrar okurken kullanmanız gerektiğini de not edeceğim . Her ikisi de ToString()
ve numaralandırmaları Enum.Parse()
da işleyebilir [Flags]
, bu yüzden onları kullanmamanız için bir neden yoktur. Unutmayın, bu da başka bir tuzaktır, çünkü şimdi muhtemelen kodu kırmadan numaralamanın adını bile değiştiremezsiniz.
Bu yüzden, bazen kendinize sorduğunuzda yukarıdakilerin hepsini tartmanız gerekir. Sadece bir bool ile kurtulabilir miyim?