Ekin Karadağ
İlk bölümde konunun temel detaylarını anlatarak başladığımız yazımıza kaldığımız yerden örneklerle devam edelim.
Burada tane boş obje yaratılmasına rağmen farklı sonuçlar döndüğünü görüyoruz. Bunun sebebi Equals metodunun burada referansları karşılaştırmasıdır. “obje1” adında yeni bir obje oluşturuldu ve obje2 ye obje1 atandı. Burada dikkat edilmesi gereken şey obje2’nin obje1 ile aynı adresi göstermesidir. “obje3” oluşturulurken obje2’den farklı olarak yeni bir instance yaratıldı. Dolayısıyla işaret ettikleri yer farklı olduğu için Equals metodu iki objeye de değer atanmamış olmasına rağmen false cevabı döndürdü.
Daha iyi anlaşılması için bir örnek daha yapalım.
Göründüğü gibi araba sınıfından türeyen a ve c nesneleri değerleri aynı olmasına rağmen referansları farklı olduğu için Equals metodu false döndürdü.
İşte Equals metodunun override edilmesinin önemi burada devreye giriyor.Equals metodunu amaca göre şekillendirebilirsiniz.
Örnekten anlaşıldığı üzere Araba sınıfının içinde Equals metodunu yanlış sonuç döndürmesini önlemek adına override edildi.Bu sayede artık içindeki veriler aynı olmasına rağmen referansları farklı olan nesnelerden false döndürme sorunu ortadan kalkmış oldu.
Peki GetHashCode metodunu nerede devreye giriyor?
Bir örnekle başlayalım ;
Göründüğü gibi 3 string değerin değerleri aynı olduğu zaman Hash kodlarında bir değişiklik görünmüyor. Peki referans tiplerinde durum değişir mi? Örneğin araba sınıfından türeyen nesnelerin verileri aynı olsa bile hash kodlarının farklı olduğu görülür.
Anlaşıldığı gibi GetHashCode metoduda Equals metodu gibi verinin kendisine değilde referansına baktığı için istenilen sonuçları döndürmeyebilir. Bu sorun Equals metoduna uyguladığımız gibi GetHashCode metodunuda override ederek giderilebilir.
Override etmeden önce bir örnek yapalım ve override etmeden önceki ve override edildikten sonraki halini görelim.
Göründüğü gibi 3 adet nesne atamış olmamıza rağmen çıktıda 2 görüyoruz. Çünkü a ve b nesnelerinin referansları aynı olduğu için hash hesaplamasıda aynı sonucu verdi.C’nin referansı a ve b’den farklı olduğu için hash sonucu farklı geldi ve 2 yanıtını döndürmüş oldu.Şimdi gelin GetHashCode metodunda değişiklik yapalım.
Yukarıda override edilmiş GetHashCode metodu sayesinde artık referanslarından ziyade içerdiği verilerin hash kodları hesaplanıyor.HashSetimize tekrar dönelim.
Göründüğü gibi hash hesaplaması değişti ve 3 nesneninde hash kodu aynı olduğu için çıktı 1 oldu.
Peki ben GetHashCode metodumun return değerini 0 olarak değiştirsem ve her nesnenin hash kodunu 0 olarak döndürsem sonuç ne olurdu?
Sonuç yine 1 gelir çünkü 3 nesne de 0 hash değerine sahip.Peki HashSetime araba sınıfından türetilmiş yeni bir nesne eklesem ve değerlerini farklı versem sonuç ne olurdu?
Aslında tüm hash kodlarını 0 atamama rağmen son eklediğim nesneyi farklı algıladı.Çünkü hash kodları aynı olmasına rağmen Equals metodunda karşılaştırma yapıldığında false döndü ve böylelikle farklı bir obje olarak düşünüldüğü için çıktımız 2 oldu.
Bu yazımda Equals ve GetHashCode metodlarının neden override edilmesi gerektiğini,ilkel türlerin ve referans türlerinin bellekte tutuluşları arasındaki farkı ve yansımalarını anlatmaya çalıştım.
Herkese iyi kodlamalar…
Paylaş
Blog