var s1 = "xyz"; var s2 = "abc"; var s3 = s1; string s4 = null; string s5; string s6 = "xyz"; string s7 = null; s1: xyz s2: abc s3: xyz s4: s5: syntax error; can't write s5 because it is not initialised! s6: xyz s7: //-------------------------------------------------- s1 == s2 False s1.Equals(s2) False s2.Equals(s1) False s2.GetHashCode() == s1.GetHashCode() False string.Equals(s1,s2) False object.Equals(s1,s2) False object.ReferenceEquals(s1,s2) False s1 == s3 True s1.Equals(s3) True s3.Equals(s1) True s3.GetHashCode() == s1.GetHashCode() True string.Equals(s1,s3) True object.Equals(s1,s3) True object.ReferenceEquals(s1,s3) True s1 == s6 True s1.Equals(s6) True s6.Equals(s1) True s6.GetHashCode() == s1.GetHashCode() True string.Equals(s1,s6) True object.Equals(s1,s6) True object.ReferenceEquals(s1,s6) True s4 == s7 True s4.Equals(s7) throws NullReferenceException s7.Equals(s4) throws NullReferenceException s7.GetHashCode() == s4.GetHashCode() throws NullReferenceException string.Equals(s4,s7) True object.Equals(s4,s7) True object.ReferenceEquals(s4,s7) True s4 == s5 Syntax error; s5 is not initialised! s4.Equals(s5) Syntax error; s5 is not initialised! s5.Equals(s4) Syntax error; s5 is not initialised! s5.GetHashCode() == s4.GetHashCode() Syntax error; s5 is not initialised! string.Equals(s4,s5) Syntax error; s5 is not initialised! object.Equals(s4,s5) Syntax error; s5 is not initialised! object.ReferenceEquals(s4,s5) Syntax error; s5 is not initialised! //-------------------------------------------------- class Z { public int I; public string S; } var z1 = new Z { I = 0, S = "a" }; var z2 = new Z { I = 0, S = "a" }; var z3 = new Z { I = 1, S = "b" }; var z4 = z1 z1 == z2 False z1.Equals(z2) False z2.Equals(z1) False z2.GetHashCode() == z1.GetHashCode() False string.Equals(z1,z2) False object.Equals(z1,z2) False object.ReferenceEquals(z1,z2) False z1 == z4 True z1.Equals(z4) True z4.Equals(z1) True z4.GetHashCode() == z1.GetHashCode() True string.Equals(z1,z4) True object.Equals(z1,z4) True object.ReferenceEquals(z1,z4) True z1 == z3 False z1.Equals(z3) False z3.Equals(z1) False z3.GetHashCode() == z1.GetHashCode() False string.Equals(z1,z3) False object.Equals(z1,z3) False object.ReferenceEquals(z1,z3) False //-------------------------------------------------- class X { public int I; public string S; public override bool Equals(object obj) {return ((X)obj).I == this.I && ((X)obj).S == this.S; } } var x1 = new X { I = 0, S = "x" }; var x2 = new X { I = 0, S = "x" }; var x3 = new X { I = 1, S = "Y" }; x1 == x2 False x1.Equals(x2) True x2.Equals(x1) True x2.GetHashCode() == x1.GetHashCode() False string.Equals(x1,x2) True object.Equals(x1,x2) True object.ReferenceEquals(x1,x2) False x1 == x3 False x1.Equals(x3) False x3.Equals(x1) False x3.GetHashCode() == x1.GetHashCode() False string.Equals(x1,x3) False object.Equals(x1,x3) False object.ReferenceEquals(x1,x3) False //-------------------------------------------------- class Y { public int I; public string S; public override int GetHashCode() { return I.GetHashCode() + S.GetHashCode(); } } var y1 = new Y { I = 0, S = "x" }; var y2 = new Y { I = 0, S = "x" }; var y3 = new Y { I = 1, S = "Y" }; y1 == y2 False y1.Equals(y2) False y2.Equals(y1) False y2.GetHashCode() == y1.GetHashCode() True string.Equals(y1,y2) False object.Equals(y1,y2) False object.ReferenceEquals(y1,y2) False y1 == y3 False y1.Equals(y3) False y3.Equals(y1) False y3.GetHashCode() == y1.GetHashCode() False string.Equals(y1,y3) False object.Equals(y1,y3) False object.ReferenceEquals(y1,y3) False