Burada gözlemlenen sorun, daha genel bir sorunun özel bir durumudur; en azından bazı durumlarda faydalı olabilecek farklı eşitlik tanımlarının sayısı, bunları ifade etmek için yaygın olarak bulunan araçların sayısını aşmaktadır. Bu sorun, bazı durumlarda, eşitliği test etmenin farklı araçlarının farklı sonuçlar vermesinin kafa karıştırıcı olduğu yönündeki talihsiz bir inançla daha da kötüleştirilir ve bu tür bir kafa karışıklığı, mümkün olduğunda farklı eşitlik biçimlerinin aynı sonuçları vermesini sağlayarak önlenebilir.
Gerçekte, kafa karışıklığının temel nedeni, farklı anlambilimlerin farklı koşullarda yararlı olmasına rağmen, farklı eşitlik ve eşitsizlik testlerinin aynı sonucu vermesinin beklenmesi gerektiğine dair yanlış bir inançtır. Örneğin, aritmetik bir bakış açısından, Decimal
yalnızca sondaki sıfırların eşit olarak karşılaştırılmasında farklılık gösterenlere sahip olmak yararlıdır . Aynı şekilde double
pozitif sıfır ve negatif sıfır gibi değerler için . Öte yandan, önbelleğe alma veya interning açısından bu tür anlambilim ölümcül olabilir. Örneğin birinin eşit Dictionary<Decimal, String>
olması myDict[someDecimal]
gereken bir tür olduğunu varsayalım someDecimal.ToString()
. Böyle bir nesne, çok sayıda olsaydı mantıklı görünürdü.Decimal
dizeye dönüştürmek istediği ve birçok yinelenen olması beklenen değerler. Ne yazık ki, 12.3 m ve 12.40 m'yi ve ardından 12.30 m ve 12.4 m'yi dönüştürmek için böyle bir önbelleğe alma kullanılırsa, son değerler "12.30" ve "12.4" yerine "12.3" ve "12.40" verir.
Eldeki konuya dönersek, eşitlik açısından sıfırlanabilir nesneleri karşılaştırmanın birden fazla mantıklı yolu vardır. C #, ==
operatörünün davranışını yansıtması gereken bakış açısını alır Equals
. VB.NET , davranışı isteyen herkesin Equals
kullanabileceği için , davranışının diğer dillerinkini yansıtması gerektiği görüşünü alır Equals
. Bir anlamda, doğru çözüm, üç yollu bir "if" yapısına sahip olmak ve koşullu ifade üç değerli bir sonuç döndürürse, kodun null
durumda ne olması gerektiğini belirtmesini gerektirmektir . Bu, diller için bir seçenek olmadığından, bir sonraki en iyi alternatif, farklı dillerin nasıl çalıştığını öğrenmek ve aynı olmadıklarını kabul etmektir.
Bu arada, Visual Basic'in C'de bulunmayan "Is" operatörü, boş değer atanabilir bir nesnenin aslında boş olup olmadığını test etmek için kullanılabilir. Bir if
testin kabul etmesi gerekip gerekmediğini makul bir şekilde sorgulayabilirken , null atanabilir türlerde çağrıldığında yerine Boolean?
normal karşılaştırma işleçlerinin dönmesi yararlı bir özelliktir. Bu arada, VB.NET'te, bir kişi yerine eşitlik operatörünü kullanmaya çalışırsa , karşılaştırmanın sonucunun her zaman olacağı ve bir şeyin boş olup olmadığını test etmek isterse kullanılması gerektiği konusunda bir uyarı alacaktır .Boolean?
Boolean
Is
Nothing
Is