Soru Geçmişi
Visual Basic'deki (Enum) listesindeki Enum'lar, kodun okunabilirliğini ve güvenilirliğini artırmak için kullanılır. Enum, programın mantığı için geçerli değerlerin katı bir kümesini oluşturarak tanımlı bir dizi isimlendirilmiş sabit belirlemek için olanak tanır.
Problem
Birçok kişi Enum'un bir değişkenin değerini yalnızca listedeki bir öğeye kısıtladığını düşünmektedir. Ancak gerçekte, Enum değişkeni bir tam sayı türü değer saklar ve temel tür için uygun herhangi bir değeri atamak mümkündür; bu durum hatalara ve beklenmeyen davranışa yol açabilir.
Çözüm
VB.NET'te, bir Enum değişkenine listede tanımlanmayan bir değeri atama yasağı yoktur. Değerlerin güvenli bir şekilde döngüye alınması için System.Enum.GetValues fonksiyonu kullanılır. Değerlerin geçerliliği ek kontrollerle sağlanır.
Kod örneği:
Enum Renkler Kırmızı = 1 Yeşil = 2 Mavi = 3 End Enum Dim c As Renkler = CType(4, Renkler) ' Bu bir derleme hatası olmayacak! For Each value As Renkler In [Enum].GetValues(GetType(Renkler)) Console.WriteLine(value) Next ' Kontrol If [Enum].IsDefined(GetType(Renkler), c) Then Console.WriteLine("Tamam") Else Console.WriteLine("Geçersiz değer!") End If
Ana Özellikler:
Enum değişkeninin her zaman yalnızca tanımlı değerleri içerdiğini garanti edebilir miyiz?
Hayır. Enum, dil seviyesinde temel sayısal türün üzerine hafif bir sarıcıdır. Belirli değerlerin geçerliliğini kontrol etmek her zaman açıkça IsDefined fonksiyonu ile yapılmalıdır.
Tanımlanmamış bir değere sahip bir Enum'un string temsilini elde etmek mümkün mü?
Evet. Tanımlanmayan bir değere atanmış Enum için ToString metodu, bu sayısal karşılığı string olarak verecektir: örneğin, Renkler = 4 olduğunda sonuç "4" olacaktır.
Enum.GetValues aracılığıyla tüm değerleri listeleyip ardından Enum değişkenine liste dışı bir sayı atarsak ne olur?
GetValues'ın döngüsü yalnızca tanımlı üyeleri dönecek, ancak Enum değişkeni yine de liste dışı herhangi bir sayıyı içerebilir — bu bir mantık hatasına dönüşecektir, sözdizimi hatasından ziyade.
Ekrandan giriş, doğrulama olmaksızın doğrudan Enum'a dönüştürülür; — geçersiz değerler alırız ve uygulama sonraki aşamalarda çöker.
Artılar:
Eksiler:
Kullanıcı değeri önce Enum.IsDefined ile doğrulanır, işleme geçersiz verilere karşı bile doğrudur.
Artılar:
Eksiler: