Equals ve Eşittir Karşılaştırma Operatörleri Arasındaki Farklar Nelerdir?
Selamlar;
Herşeyin 1 ve 0 olduğu bir dünyada yaşıyoruz. Bugünkü konumuz true ve false yani comparison operators. Karşılaştırma operatörleri arasında farkların çoğunlukla karıştırıldığını ve hatta hepsinin aynı amaçlı kullanıldığının sanılması üzerine bu konuda makale yazmaya karar verdim.
(==) ve Equals() methodları’nın ikisi de farklı 2 değeri karşılaştırmak için kullanılır. (==) operator’ü 2 nesneyi karşılaştırırken, Equals() methodu nesnenin içerdiği string’i karşılaştırır. Yani kısaca (==) operatörü 2 nesnenin referans değerlerini karşılaştırırken Equals() methodu sadece içeriği karşılaştırır.
Aşağıdaki kod C#6.0 ile yazılmıştır. Eminim dikkatinizi çeken kayda değer bir farklılık vardır.” {0}” yerine direk yazılacak değer “\{..}” şeklinde yazılmıştır. Bu da yeni Roslyn ile bize gelen kolaylıklardan sadece biridir. Gelelim esas konumuza. Aşağıda 2 nesne hem içerik hem de referans olarak birbirinin aynı olduğu için 2’side true dur.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Equlizer { class Program { static void Main(string[] args) { string message = "Is Equal"; string operationMessage = message; Console.WriteLine("== operator kıyaslaması: \{message == operationMessage}"); Console.WriteLine("Equals() method kıyaslaması: \{message.Equals(operationMessage)}"); Console.WriteLine(""); Console.WriteLine("*".PadLeft(20,'*')); Console.WriteLine(""); Console.ReadLine(); } } } |
Şimdi aşağıdaki örneği inceleyelim: values ve myBike nesneleri string değer olarak aynı oldukları için Equals() methodu sonucu true dönmüştür. Ancak referance değerleri bakımından birbirlerinden farklı oldukları için (==) sonucu false dönmüştür.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Equlizer { class Program { static void Main(string[] args) { object motorbike = "kawasaki"; char[] values = { 'k', 'a', 'w', 'a', 's', 'a', 'k', 'i' }; object myBike = new string(values); Console.WriteLine("== operator kıyaslaması: \{ motorbike == myBike}"); Console.WriteLine("Equals() method kıyaslaması: \{ motorbike.Equals(myBike)}"); Console.WriteLine(""); Console.WriteLine("*".PadLeft(20, '*')); Console.WriteLine(""); Console.ReadLine(); } } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Equlizer { class Program { static void Main(string[] args) { string nullTest = "Is Null"; string txtNull = null; Console.WriteLine("== operator kıyaslaması: \{nullTest == txtNull}"); Console.WriteLine("Equals() method kıyaslaması: \{txtNull.Equals(nullTest)}"); Console.ReadLine(); } } } |
Yukarıdaki örnekte null değer atanmış txtNull değişkeni Equals() methodu ile karşılaştırılamaz ve hata döner. Çünkü bakılacak bir content yoktur.
Ama (==) karşılaştırmasında referance değerlerine bakıldığı için sorun yoktur ve sonuç tabiki aşağıdaki gibi false’dur.
Javascript’deki “==” ve “===” karşılaştırma operatörlernin farklarına gelin hep beraber bakalım: (==) operatörü ile code behind’daki durumun tam tersi olarak 2 değişkenin context değerlerine bakılırken (===) operatörü ile değişkenlerin referans değerlerine bakılır. Alttaki örneklerde bu konu ile ilgili açıklamalar detaylı olarak yapılmıştır.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
@{ Layout = null; } <!DOCTYPE html> <html> <head> <script src="~/Scripts/jquery-2.1.3.min.js"></script> <script> $(document).ready(function () { $('#result').append("[0 == false] : " + (0 == false)); //true Çünkü aynı değere sahipler. $('#result').append("</br>[0 === false] : " + (0 === false)); //flase Çünkü farklı tipteler. $('#result').append('</br>[ 1 == "1"] : ' + (1 == "1")); //true Çünkü otomatik tip düzeltme var ve aynı değere sahipler. $('#result').append('</br>[ 1 === "1"] : ' + (1 === "1")); //false Çünkü farklı tipteler. $('#result').append('</br>[ null == undefined] : ' + (null == undefined)); //true Çünkü aynı değere sahipler. $('#result').append('</br>[ null === undefined] : ' + (null === undefined)); //false Çünkü farklı tipteler. $('#result').append("</br>[ '0' == false] : " + ('0' == false)); //true Çünkü otomatik tip düzeltme saysesinde aynı değere sahipler. $('#result').append("</br>[ '0' === false ] : " + ('0' === false)); //false Çünkü farklı tipteler. $('#result').append("</br>-----------------------------------------------"); var a = [1, 2, 3]; var b = [1, 2, 3]; var c = a; var ab_isSame = (a === b); // false (a ve b aynı tipte olmalarına rağmen farklı nesnelerdir.) var ac_isSame = (a === c); // true (a ve c hem tipleri aynı hem de aynı nesnelerdir.) $('#result').append("</br> var a = [1, 2, 3];"); $('#result').append("</br> var b = [1, 2, 3];"); $('#result').append("</br> var c = a;"); $('#result').append('</br>[ a === b] : ' + (a === b)); //false Çünkü farklı nesnelerdir. $('#result').append('</br>[ a === c] : ' + (a === c)); //true Çünkü aynı nesnelerdir. $('#result').append("</br>-----------------------------------------------"); var a = new String("123") var b = "123"; $('#result').append('</br> var a = new String("123")'); $('#result').append('</br> var b = "123"'); $('#result').append('</br>[ a == b] : ' + (a == b)); //true Çünkü context string içerik aynıdır. $('#result').append('</br>[ a === b] : ' + (a === b)); //false Çünkü 2 farklı tipte nesnelerdir. }); </script> <meta name="viewport" content="width=device-width" /> <title>Index</title> </head> <body> <div id="result"> </div> </body> </html> |
Yukarıdaki örneklerden de anlaşılacağı gibi karşılaştırma operatörlerinin kullanımı birbirine benzemesine karşın, aslında yaptıkları işler birbirinden çok farklıdır. Mesela code behind’da eğer sadece içeriğe bakılacak ise (==) operatör’ü yerine Equals() methodu kullanılmalıdır. Ama null kontrolü yapılması şarttır. “kawasaki” örneğinde olduğu gibi yanlış karşılaştırma operatör’ü kullanmak bizi yanlış sonuçlara götürecektir. Aynı şekilde Javascript’de işler biraz değişmekte ve (==) operatörü bu sefer nesnelerin içerdiği string’leri karşılaştırmaktadır. Aynı şekilde (===) operatörü ise içerik yerine nesnelerin kendisini kıyaslamaktadır.
Geldik bir makalenin daha sonuna. Umarım bu küçük ama önemli bilgiler işinize yarar.
Yeni bir makalede görüşmek üzere hoşçakalın.
Selamlar Hocam;
Gerçekten bilmiyormuşum. Ben hepsinin amacı aynı zannediyordum. Meğersem aralarında dağlar kadar fark varmış.
Böyle ince konulara da yer verdiğiniz için teşekkür ederim.
İyi çalışmalar.
Elinize sağlık hocam.
Bana sorsalar aynı tas aynı hamam derdim. Ve direk yanılırdım.
İyiki varsınız hocam.
Hocam elinize sağlık;
Cidden çok önemli bir konuyu bu kadar güzel ve çarpıcı şekilde anlattığınız için teşekkür ederim.
Yeni seminerlerinizi iple çekiyorum…