26 Haziran 2010 Cumartesi

C#'da GetHashCode Kullanimi

GetHashCode, kisaca hangi nesne uzerinden cagrilmissa o nesneye ait bir tamsayi deger ureten komuttur. Bu degeri olustururken iki ayrintiya dikkat eder CLR;

-Eger nesnemiz deger turluyse, direk degiskenlerin sayi degerlerini bize getirir.Yani;

int a=6;
int b=6;
int sayi1=a.GetHashCode();
int sayi2=b.GetHashCode();

dedigimiz zaman sayi1 ve sayi2'nin 6 olarak atandigini gorecegiz.Cunku burada a ve b int turunden, yani deger turlu oldugundan direk bize sayisal degerlerini geri donduruyor.

-Eger nesnemiz referans turlu olursa, bu sefer de tahmin edebileceginiz uzere tuttugu referans, yani kendi adresine gore bir int deger uretir. Yani;

Urun ur1=new Urun(1,"Monitor",200);
Urun ur2=new Urun(1,"Monitor",200);


GetHashCode()'larini calistirdigimiz zaman farkli kodlar uretildigini gorecegiz. Bunun nedeni, her ne kadar ayni degerleri tutsalarda, "new" keyword'u sonucunda ram'de tekrar farkli adreste nesne yaratilmasidir. Yani ur1 ve ur2 farkkli adresleri tuttugundan farkli kodlar uretilir.

Bu bilgiler isiginda su soru gelebilir aklimiza. Neden bu nesnelerin int. kodlarini uretme ihtiyaci duyuyoruz?
-Cevabimiz cok basit, iki nesneyi karsilastirmada en hizli yol her zaman integer'larda olur. Burada da iki nesneyi karsilastirmak icin nesnelerin GetHashCode()'larini karsilastiriyoruz.

NOT: object ve string'lerin referans turlu olduklarini biliyoruz. Ama C#'da sunu her zaman hatirlamaliyiz ki, object ve string atama islemlerinde deger turlu ozellik gosterirler. Yani;

object a="abc";
object b="abc";

dersek a ve b'nin farkli adresleri tuttugunu goz onunde bulundurup farkli hashcode'lar bekleriz ama derledigimiz zaman gorecegiz ki a ve b icin olusturan kodlarin ikisi de ayni. Buradan da su sonucu cikarabiliriz ki object ve string atama islemlerinde deger turlu ozellik kazanir...

0 yorum: