Sorunun Tarihi:
Queue ve Stack koleksiyonları, sırasıyla FIFO (İlk Gelen İlk Hizmet) ve LIFO (Son Gelen İlk Hizmet) ilkelerini gerçekleştiren temel veri yapılarıdır. Bunlar, klasik VB6 döneminden beri aktif olarak kullanılmaktadır ve VB.NET ile bu yapılar standart sınıflar haline gelmiştir. Queue, elemanların geldikleri sıraya göre işlenmesi gereken senaryolar (örneğin, görev kuyrukları) için faydalıdır, Stack ise son eklenen elemanın diğerlerinden önce işlenmesi gerektiği durumlar için (örneğin, çağrı yığını veya eylemleri geri alma) kullanılır.
Sorun:
Bazen belirli bir görev için yanlış yapı seçildiği ya da çoklu iş parçacıklı senaryolarda güvenli bir şekilde kullanılmadıkları sıkça yanlış yapılmaktadır. Aynı zamanda, boş bir yığın veya kuyruktan öğe çıkartma hataları da meydana gelebilir ve bu da istisnaları tetikler.
Çözüm:
Visual Basic'te bu yapılarla çalışmak için uygun sınıflar bulunmaktadır:
System.Collections.QueueSystem.Collections.StackKuyruk ve yığınla çalışma örneği:
' Kuyrukla çalışma Dim q As New Queue() q.Enqueue("Birinci") q.Enqueue("İkinci") Dim item = q.Dequeue() ' item = "Birinci" ' Yığınla çalışma Dim s As New Stack() s.Push("A") s.Push("B") Dim top = s.Pop() ' top = "B"
Anahtar özellikler:
1. For Each ile dolaşırken Queue veya Stack koleksiyonunu değiştirmek mümkün müdür?
Hayır, For Each ile dolaşırken koleksiyona eleman eklemek veya çıkarmak InvalidOperationException'a neden olur.
Kod örneği:
Dim q As New Queue() q.Enqueue(1) q.Enqueue(2) For Each elem In q q.Enqueue(3) ' iterasyon sırasında istisna oluşturur Next
2. Boş bir Queue veya Stack için Peek() metodu ne döndürecektir?
Peek, koleksiyon boşsa InvalidOperationException fırlatır, varsayılan bir değer döndürmez.
Kod örneği:
Dim st As New Stack() Dim first As Object = st.Peek() ' İstisna!
3. Queue(Of T) ile Queue arasındaki fark nedir ve neden jenerik koleksiyonları tercih etmelisiniz?
Queue(Of T), Queue'nın jenerik versiyonudur, tip güvenliğidir ve boxing/unboxing'ten kaçınmanıza olanak tanır. Bilinen türlerle çalışırken her zaman bunu seçmek daha iyidir.
Dim numbers As New Queue(Of Integer)() numbers.Enqueue(5) ' Sadece Integer
Bir belgeleri yazdırma kuyruğu uygulamasında, geliştirici yazdırma görevlerini Stack'te saklıyor, Queue'da değil. Sonuç olarak, belgeler ters sırayla yazdırılıyor (son eklenen ilk önce erişiliyor).
Artılar:
Eksiler:
Aynı proje, yazdırma görevlerini saklamak için yığını Queue ile değiştiriyor. Artık belgeler soldan sağa sırayla yazdırılıyor, bu da kullanıcıların beklentisi.
Artılar:
Eksiler: