Geçersiz İşlevler
Geçersiz İşlevler
Önceki yazılarımızdaki bilgiler, .NET çalışma zamanında çalışacak nesneleri yazmak için yeterlidir, ancak bu nesneler, .NET Framework’te iyi çalışacak şekilde yazılmış gibi hissetmeyecektir. Bu yazımız, kullanıcı tanımlı nesnelerin .NET çalışma zamanı ve .NET Framework’teki nesneler gibi çalışmasının nasıl sağlanacağını ayrıntılarıyla açıklar.
ToString() işlevinin nesne sınıfından geçersiz kılınması, bir nesnedeki değerlerin güzel bir temsilini verir. Bu yapılmazsa, object.ToString() yalnızca sınıfın adını döndürür.
Nesne üzerindeki Equals() işlevi, iki nesnenin eşit olup olmadığını belirlemek için .NET Framework sınıfları tarafından çağrılır.
Bir sınıf ayrıca, kullanıcının Equals()’ı çağırmak yerine yerleşik işleçleri nesnenin örnekleriyle kullanmasına izin veren operator==() ve operator!=()’yi geçersiz kılabilir.
Console.WriteLine()’ın bir nesneyi dize temsiline dönüştürmesi gerektiğinde, bir nesnenin özel uygulamasına iletecek olan ToString() sanal işlevini çağırır. Farklı biçimlerde bir kayan nokta sınıfı uygulamak gibi biçimlendirme üzerinde daha fazla denetim istiyorsanız, IFormattable arabirimini geçersiz kılabilirsiniz.
Equals(), iki nesnenin aynı içeriğe sahip olup olmadığını belirler. Bu işlev, iki nesnenin eşit olup olmadığını belirlemek için toplama sınıfları (Array veya Hashtable gibi) tarafından çağrılır. Çalışan örneğini genişleterek aşağıdakileri yazabilirsiniz.
Bu durumda, operatör==() ve operatör!=() de aşırı yüklenmiştir, bu da operatör sözdiziminin Main()’in son satırında kullanılmasına izin verir. Bu işleçler çiftler halinde aşırı yüklenmelidir; ayrı ayrı aşırı yüklenemezler.
Bu örnekte, Equals() uygulamasının işleç uygulamasına iletildiğini unutmayın. Bu örnek için, bunu her iki şekilde de yapabilirsiniz, ancak yapılar için diğer şekilde yaparsanız fazladan bir kutulama işlemine ihtiyacınız olacaktır. Equals() bir nesne parametresi aldığından, Equals() öğesini çağırmak için bir değer türünün her zaman kutu içine alınması gerekir, ancak kesin türü belirlenmiş karşılaştırma işleçlerini çağırmak için kutulama gerekmez. İşleçler Equals()’a iletilirse, her zaman kutulamak zorunda kalırlar.
Hash’ler ve Hash Kodu Alma
.NET Framework, nesnelerin bir anahtarla hızlı aranması için yararlı olan Hashtable sınıfını içerir. Bir karma tablo, bir sınıfın belirli bir örneği için bir tamsayı “anahtar” üreten bir karma işlevi kullanarak çalışır. Bu anahtar, örneğin içeriğinin yoğunlaştırılmış bir sürümüdür. Örnekler aynı hash koduna sahip olabilse de, bunun olması pek olası değildir.
Bir karma tablo, bu anahtarı, bir nesneler koleksiyonunda belirli bir nesneyi bulmak için aranması gereken nesne sayısını büyük ölçüde sınırlamanın bir yolu olarak kullanır. Bunu, önce nesnenin hash değerini alarak yapar, bu da farklı bir hash koduna sahip tüm nesneleri ortadan kaldırır ve yalnızca aynı hash koduna sahip olanları aranacak şekilde bırakır. Bu hash koduna sahip örneklerin sayısı az olduğundan, aramalar çok daha hızlı olabilir.
Daha ayrıntılı bir açıklama için temel fikir budur, lütfen iyi bir veri yapıları ve algoritmalar çalışmasına bakın. Hash’ler son derece kullanışlı bir yapıdır. Hashtable sınıfı nesneleri depolar, bu nedenle herhangi bir türü depolamak için bunları kullanmak kolaydır.
GetHashCode() tarafından döndürülen değerlerin Equals() tarafından döndürülen değerle ilişkili olması gerektiğinden, kullanıcı tarafından yazılan sınıflarda GetHashCode() işlevi geçersiz kılınmalıdır. Equals() tarafından aynı olan iki nesne her zaman aynı karma kodu döndürmelidir.
GetHashCode()’un varsayılan uygulaması bu şekilde çalışmaz ve bu nedenle doğru çalışması için geçersiz kılınması gerekir. Geçersiz kılınmazsa, hash kodu yalnızca bir nesnenin aynı örneği için aynı olacaktır ve eşit olan ancak aynı örnek olmayan bir nesne için yapılan arama başarısız olacaktır.
Çalışan sınıfında, id üyesi benzersizdir, dolayısıyla karma kod için kullanılır. Main() işlevinde birkaç çalışan oluşturulur ve bunlar daha sonra çalışanların adreslerini saklamak için anahtar değerler olarak kullanılır.
Benzersiz bir değer yoksa, bir işlevde bulunan değerlerden karma kod oluşturulmalıdır. Çalışan sınıfının benzersiz bir tanımlayıcısı yoksa, ancak ad ve adres alanları varsa, hash işlevi bunları kullanabilir. Aşağıda, kullanılabilecek bir hash işlevi gösterilmektedir.
Excel BAŞV hatası
Excel programında BAŞV Hatası ne zaman ortaya çıkar
#### excel hatası neden olur iphone
Excel REF hatası nedir
Excel DDE hatası nedir
Tasarım Kuralları
Equals() işlevini geçersiz kılan herhangi bir sınıf, GetHashCode() öğesini de geçersiz kılmalıdır. Aslında, C# derleyicisi böyle bir durumda bir hata verecektir. Bu hatanın nedeni, sınıf bir Hashtable’da kullanıldığında garip ve hata ayıklaması zor davranışları önlemesidir.
Hashtable sınıfı, eşit olan tüm örneklerin aynı karma değerine sahip olmasına bağlıdır. Bununla birlikte, GetHashCode() öğesinin varsayılan uygulaması, örnek bazında benzersiz olan bir değer döndürür. Bu uygulama geçersiz kılınmazsa, nesneleri bir hash tablosuna koymak kolaydır, ancak bunları alamamak kolaydır.
Değer Türü Yönergeleri
System.ValueType sınıfı, tüm değer türleri için çalışan bir Equals() sürümünü içerir, ancak Equals()’ın bu sürümü, tür için bitsel kalite geçersizse yansıtma yoluyla çalışır (değer türünün referansları varsa durum böyle olacaktır) referans türleri) ve bu nedenle yavaştır. Bu nedenle, tüm değer türleri için bir Equals() uygulamasının yazılması önerilir.
Referans Türü Yönergeleri
Çoğu referans türü için kullanıcılar, == öğesinin referans karşılaştırması anlamına gelmesini bekler ve bu durumda, nesne Equals()’ı uygulasa bile == aşırı yüklenmemelidir.
Türün değer semantiği varsa (String veya BigNum gibi bir şey), operator==() ve Equals() geçersiz kılınmalıdır. Bir sınıf + veya -‘yi aşırı yüklerse, bu, == ve Equals()’ı da geçersiz kılması gerektiğinin oldukça iyi bir göstergesidir. Daha incelikli bir ilgi alanı, kalıtım hiyerarşileri devreye girdiğinde Equals()’ın nasıl çalıştığıdır.
Base sınıfı, Equals()’ı uygular ve Base türündeki nesneler için beklendiği gibi çalışır. Doğrudan nesneden (veya Equals()’ı geçersiz kılmayan sınıflardan) türetilen sınıflar, başvuruları karşılaştıran object.Equals()’ı kullanacaklarından sorunsuz çalışır.
Ancak Base’den türetilen herhangi bir sınıf, Equals()’ın uygulanmasını Base’den devralır ve bu nedenle yanlış sonuçlar üretir. Bu nedenle, Equals()’ı geçersiz kılan bir sınıftan türetilen herhangi bir sınıf, Equals()’ı da geçersiz kılmalıdır. Nesnenin beklenen türde olduğundan emin olmak için bir kontrol ekleyerek bu duruma karşı önlem alabilirsiniz.
Web sitelerinizi, arama motorlarında en yukarı getirmek adına sizlere 3 adet paket öneriyoruz. Bu paketler sayesinde web siteleriniz aramalarda 1 yıl içerisinde en yukarıya tırmanacaktır.
1) Backlink Paketi 50 $ (Yıllık Ücret)
2) Hızlandırma Paketi 300 $ (Yıllık Ücret)
3) Kelime Yönlendirme Paketi 150 $ (Aylık Ücret)