== — operator, can be overloaded. .Equals() — method, can be overridden.
For value types:
1int a = 5, b = 5;2a == b; // true3a.Equals(b); // true
For reference types (default):
1string s1 = "hello";2string s2 = new string(new char[] {'h', 'e', 'l', 'l', 'o'});34s1 == s2; // true (string overloads ==)5s1.Equals(s2); // true (string overrides Equals)
Custom class (default):
1class Person {2 public string Name;3}45var p1 = new Person { Name = "Alice" };6var p2 = new Person { Name = "Alice" };78p1 == p2; // false (different references)9p1.Equals(p2); // false (different references)
Overriding behavior:
Best practice: