Confusion Over Equals and "==" in Simple Way

Consider that fact that object. Equals look for value as well as reference. However you can overload it to just check for value matching by overriding Equals method in class.

This is the application of "EQUALS" in various scenario.More to come,

  1. //Use of Equals on Refrence type    
  2. using System;    
  3. class Product {    
  4.     public int Price {    
  5.         get;    
  6.         set;    
  7.     }    
  8.     public string Name {    
  9.         get;    
  10.         set;    
  11.     }    
  12. }    
  13. class ProductWithOverride {    
  14.     public int Price {    
  15.         get;    
  16.         set;    
  17.     }    
  18.     public string Name {    
  19.         get;    
  20.         set;    
  21.     }    
  22.     public override bool Equals(object obj) {    
  23.         if (obj == nullreturn false;    
  24.         if (this.GetType() != obj.GetType()) return false;    
  25.         ProductWithOverride p = (ProductWithOverride) obj;    
  26.         return (this.Price == p.Price) && (this.Name == p.Name);    
  27.     }    
  28. }    
  29. class Demo {    
  30.     static void Main() {    
  31.         Product p1 = new Product {    
  32.             Price = 10, Name = "foo"    
  33.         };    
  34.         Product p2 = new Product {    
  35.             Price = 10, Name = "foo"    
  36.         };    
  37.         bool a = p1.Equals(p2);    
  38.         Console.WriteLine(a.ToString()); //False     
  39.         //Reason- two different refrence .    
  40.         p2 = p1;    
  41.         bool b = p1.Equals(p2);    
  42.         Console.WriteLine(b.ToString()); //True    
  43.         //Reason -Same refrence.    
  44.         //using Override Equals now    
  45.         ProductWithOverride po1 = new ProductWithOverride {    
  46.             Price = 10, Name = "foo"    
  47.         };    
  48.         ProductWithOverride po2 = new ProductWithOverride {    
  49.             Price = 10, Name = "foo"    
  50.         };    
  51.         bool val = po1.Equals(po2);    
  52.         Console.WriteLine(val.ToString()); //True    
  53.         //Reason- Now we override equals so only hecks for value equality.    
  54.         po2 = po1;    
  55.         bool val1 = po1.Equals(po2);    
  56.         Console.WriteLine(val1.ToString()); //True    
  57.         //Reason- Same value and same refrence.    
  58.         //Now testing for String as string Confuses many :)    
  59.         string test1 = "testme";    
  60.         string test2 = "testme";    
  61.         bool stringval = test1.Equals(test2);    
  62.         Console.WriteLine(stringval.ToString());    
  63.         string test3 = "testmetoo";    
  64.         string test4 = "testmetoo";    
  65.         test4 = test3;    
  66.         bool stringval1 = test3.Equals(test4);    
  67.         Console.WriteLine(stringval1.ToString()); //True    
  68.         //Notice behaviour of String .    
  69.         //Reason-Because strings are immutable and the runtime may choose to put any two strings with the same content together into the same reference.    
  70.         //Also,Each string literal does not necessarily result in a new string instance. When two or more string literals that are equivalent according to the string equality operator (Section 7.9.7) appear in the same assembly, these string literals refer to the same string instance.    
  71.         //Casting into object      
  72.     
  73.         Product p3 = new Product {    
  74.             Price = 10, Name = "foo"    
  75.         };    
  76.         Product p4 = new Product {    
  77.             Price = 10, Name = "foo"    
  78.         };    
  79.         Console.WriteLine("person1a and person1b: {0}", ((object) p3).Equals((object) p4)); //False    
  80.         p4 = p3;    
  81.         Console.WriteLine("person1a and person1b: {0}", ((object) p3).Equals((object) p4)); //True    
  82.         //using Override Equals now and converting to Object Type    
  83.         ProductWithOverride po3 = new ProductWithOverride {    
  84.             Price = 10, Name = "foo"    
  85.         };    
  86.         ProductWithOverride po4 = new ProductWithOverride {    
  87.             Price = 10, Name = "foo"    
  88.         };    
  89.         Console.WriteLine("person1a and person1b: {0}", ((object) po3).Equals((object) po4)); //True    
  90.         po4 = po3;    
  91.         Console.WriteLine("person1a and person1b: {0}", ((object) po3).Equals((object) po4)); //True    
  92.     
  93.         //Casting string into Object type    
  94.         string test1 = "testme";    
  95.         string test2 = "testme";    
  96.         object one = test1;    
  97.         object two = test2;    
  98.         object three = null;    
  99.         object four = null;    
  100.         Console.WriteLine("one and two: {0}", (one.Equals(two))); // True Compiler have single refrence in case of String    
  101.         two = one;    
  102.         Console.WriteLine("one and two: {0}", (one.Equals(two))); // True We made single refrence    
  103.         Console.WriteLine("three and four: {0}", (three.Equals(four))); // This gives Exception as Equals checks for refrence and here the refrence is null. Checkinh "==" operator here is interesting(will bring that in coming article).      
  104.     
  105.     
  106.     }    
  107. }   
Use of "== " on reference type:

  • Note- For reference types where == has not been overloaded,

  • It compares whether two references refer to the same object - which is exactly what the implementation of Equals does in System. Object.

  • Also to note, Operators are overloaded, not overridden,

  • For predefined value types,

  • The equality operator (==) returns true if the values of its operands are equal, false otherwise.

  • For reference types other than string, == returns true if its two operands refer to the same object. For the string type, == compares the values of the strings.

  1. using System;  
  2. class Product {  
  3.     public int Price {  
  4.         get;  
  5.         set;  
  6.     }  
  7.     public string Name {  
  8.         get;  
  9.         set;  
  10.     }  
  11. }  
  12. class ProductWithOverride {  
  13.     public int Price {  
  14.         get;  
  15.         set;  
  16.     }  
  17.     public string Name {  
  18.         get;  
  19.         set;  
  20.     }  
  21.   
  22.   
  23.     public static bool operator == (ProductWithOverride a, ProductWithOverride b) {  
  24.         // If both are null, or both are same instance, return true.    
  25.         if (System.Object.ReferenceEquals(a, b)) {  
  26.             return true;  
  27.         }  
  28.   
  29.         // If one is null, but not both, return false.    
  30.         if (((object) a == null) || ((object) b == null)) {  
  31.             return false;  
  32.         }  
  33.   
  34.         // Return true if the fields match:    
  35.         return a.Name == b.Name && a.Price == b.Price;  
  36.     }  
  37.     public static bool operator != (ProductWithOverride a, ProductWithOverride b) {  
  38.         return !(a == b);  
  39.     }  
  40.   
  41.   
  42. }  
  43. class Demo {  
  44.     static void Main() {  
  45.         Product p1 = new Product {  
  46.             Price = 10,  
  47.             Name = "foo"  
  48.         };  
  49.         Product p2 = new Product {  
  50.             Price = 10,  
  51.             Name = "foo"  
  52.         };  
  53.         bool a = (p1 == p2);  
  54.         Console.WriteLine(a.ToString()); //False    
  55.         //Reason- two different refrence .    
  56.         p2 = p1;  
  57.         bool b = (p1 == p2);  
  58.         Console.WriteLine(b.ToString()); //True    
  59.         //Reason -Same refrence.    
  60.         //using Override == now    
  61.         ProductWithOverride po1 = new ProductWithOverride {  
  62.             Price = 10,  
  63.             Name = "foo"  
  64.         };  
  65.         ProductWithOverride po2 = new ProductWithOverride {  
  66.             Price = 10,  
  67.             Name = "foo"  
  68.         };  
  69.         bool val = (po1 == po2);  
  70.         Console.WriteLine(val.ToString()); //True    
  71.         //Reason- Now we override == so only hecks for value equality.    
  72.         po2 = po1;  
  73.         bool val1 = (po1 == po2);  
  74.         Console.WriteLine(val1.ToString()); //True    
  75.         //Reason- Same value and same refrence.    
  76.   
  77.     }  
  78. }  

For value type - Both operator checks for value Equality.