C#'ta Queue ve Stack: FIFO, LIFO ve boş durum davranışı
Dev Leader, C#'taki Queue<T> ve Stack<T> koleksiyonlarını yalnızca sıralama kuralları üzerinden değil, boş durum, Peek/TryPeek, kopya görünümleri ve numaralandırma sınırları üzerinden anlatıyor. Rehber, sıralama kuralının iş akışı garantisi anlamına gelmediğini somut örneklerle gösteriyor; yeni başlayanlar kadar mevcut kodunu gözden geçirmek isteyenler için de faydalı.
Kilit noktalar
- Queue<T> FIFO, Stack<T> LIFO uygular; ikisi de silmeden okumak için Peek/TryPeek sunar.
- TryDequeue ve TryPop boş durumda false döner; böylece geçerli 0 değeri ile öğe yokluğu karışmaz.
- Dequeue, Pop ve Peek boş koleksiyonda exception fırlatır; boşluğun normal olduğu yerde try varyantlarını tercih edin.
- ToArray kuyrukta çıkarma, yığında pop sırasına göre sığ bir kopya üretir; nesnelerin iç state'i paylaşılır.
- Aynı koleksiyonda foreach sırasında Dequeue/Pop yapmak güvenli snapshot değildir; tüketmek için try-removal döngüsü kullanın.
- Öğeyi çıkarmak ile işi başarıyla tamamlamak ayrı olaylardır; hata durumunda geri koyma politikasını uygulama belirler.
Queue<T> ve Stack<T>, öğenin hangi sırayla çıkarılacağını koleksiyonun kendisinde ifade eder: kuyrukta ilk giren ilk çıkar (FIFO), yığında son giren ilk çıkar (LIFO). Ekleme için Enqueue ve Push, çıkarma için Dequeue ve Pop, silmeden bakmak için Peek ve TryPeek kullanılır. Yazarın asıl vurgusu, bu sıralamanın işin ne zaman bittiğini, hatalı işlemin tekrar denenip denenmeyeceğini ya da verinin yeniden başlatmaya dayanıp dayanmayacağını söylemediği.
Boş koleksiyon çoğu zaman normal bir durumdur; bu yüzden TryDequeue ve TryPop false döndürerek "öğe yok" ile "değeri sıfır olan öğe"yi ayırır. Peek rezervasyon değildir, ToArray ise sığ bir görünüm üretir: kuyrukta çıkarma, yığında pop sırasını izler ama nesnelerin iç durumunu dondurmaz. Numaralandırma sırasında öğe çıkarmak da güvenli bir anlık görüntü varsayımına dayanmamalı.
Gerçek dünyada kullanımı
- Tek iş parçacıklı bir arka plan adımında gelen istekleri varış sırasına göre işleyen basit bir kuyruk.
- Editör veya form ekranında son yapılan işlemleri en yeniden eskiye geri alma geçmişi tutan bir yığın.
- Kullanıcıya "sırada bekleyen iş" sayısını göstermek için kuyruğu ToArray ile kopyalayıp tüketmeden rapor üretmek.
- Dış servisten gelen ölçümleri toplayan bir döngüde boş sonucu exception yerine TryDequeue ile normal akış olarak ele almak.
Neden önemli
Queue ve Stack'i doğru kullanmak, tüketim sırasını kodda gizli bir konvansiyon olmaktan çıkarır; ama bu koleksiyonların yalnızca sıralama sözü verdiğini bilmek, retry, dayanıklılık ve eşzamanlılık beklentilerini yanlış yere yazmanızı engeller.