C # .NET рдореЗрдВ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреА рддреБрд▓рдирд╛ рдХрд░рдирд╛

C # .NET рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреА рддреБрд▓рдирд╛ рдХрд░рдиреЗ рдХреЗ рдХрдИ рддрд░реАрдХреЗ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рджреЛрдиреЛрдВ рд╡рд░реНрдЧреЛрдВ, рдФрд░ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЗред рдРрд╕реЗ рдХрдИ рддрд░реАрдХреЗ рд╣реИрдВ рдЬреЛ рдЗрди рддрд░реАрдХреЛрдВ рдХреЛ рд╕реБрд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд┐рдП рдмрд┐рдирд╛ рдФрд░ рдЙрдирдХреЗ рд╕рдХреНрд╖рдо рдЙрдкрдпреЛрдЧ рдФрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди (рдпрджрд┐ рдкреБрди: рдирд┐рд░реНрдзрд╛рд░рдг рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ) рдХреЛ рд╕рдордЭрдиреЗ рдХреЗ рдмрд┐рдирд╛, рджрд▓рд┐рдпрд╛ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рд╕рд┐рд░ рдореЗрдВ рдмрдиреЗрдЧрд╛ред

рддреЛ, System.Object рд╡рд░реНрдЧ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рддрд░реАрдХреЗ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ:

рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдФрд░:
 public static bool operator == (Foo left, Foo right); 

рдпрд╣ рднреА IEquatable, IStructuralEquatable рд╡рд╛рд░рд┐рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрднрд╡ рд╣реИред

ReferenceEquals

ReferenceEquals рд╡рд┐рдзрд┐ рджреЛ рд▓рд┐рдВрдХ рдХреА рддреБрд▓рдирд╛ рдХрд░рддреА рд╣реИред рдпрджрд┐ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд╕рдВрджрд░реНрдн рд╕рдорд╛рди рд╣реИрдВ, рддреЛ рд╕рд╣реА рд╣реИред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдпрд╣ рд╡рд┐рдзрд┐ рд╕рдорд╛рдирддрд╛ рдХреЗ рд▓рд┐рдП рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреА рдЬрд╛рдВрдЪ рдирд╣реАрдВ рдХрд░рддреА рд╣реИ, рд▓реЗрдХрд┐рди рдкрд╣рдЪрд╛рди рдХреЗ рд▓рд┐рдПред рдпрджрд┐ рдЖрдк рдЗрд╕ рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдкреНрд░рдХрд╛рд░ рдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ (рднрд▓реЗ рд╣реА рдЖрдк рдЙрд╕реА рдЙрджрд╛рд╣рд░рдг рдХреЛ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ), рддреЛ рдпрд╣ рд╣рдореЗрд╢рд╛ рдЧрд▓рдд рд╣реЛрдЧрд╛ред рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рд╣реЛрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рд╕реНрдерд╛рдирд╛рдВрддрд░рдг рдХреЗ рджреМрд░рд╛рди рдорд╣рддреНрд╡рдкреВрд░реНрдг рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рдкреИрдХреЗрдЬрд┐рдВрдЧ рд╣реЛрдЧреА рдФрд░ рдЙрдирдХреЗ рд▓рд┐рдВрдХ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╣реЛрдВрдЧреЗред
рдпрд╣рд╛рдБ, рдореИрдВ рдЗрд╕ рд╡рд┐рдзрд┐ рджреНрд╡рд╛рд░рд╛ рджреЛ рд▓рд╛рдЗрдиреЛрдВ рдХреА рддреБрд▓рдирд╛ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:
 class Program { static void Main(string[] args) { string a = "Hello"; string b = "Hello"; if(object.ReferenceEquals(a,b)) Console.WriteLine("Same objects"); else Console.WriteLine("Not the same objects"); Console.ReadLine(); } } 

рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рдХрд╛рд░реНрдпрдХреНрд░рдо рдЖрд╕рд╛рдиреА рд╕реЗ "рд╕рдорд╛рди рд╡рд╕реНрддреБрдУрдВ" рдХрд╛ рдЙрддреНрдкрд╛рджрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЪрд┐рдВрддрд╛ рди рдХрд░реЗрдВ, рдпрд╣ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдЗрдВрдЯрд░реНрдирд┐рдВрдЧ рдХреЗ рдХрд╛рд░рдг рд╣реИред рд▓реЗрдХрд┐рди рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рдХрд╣рд╛рдиреА рд╣реИ рдФрд░ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдХреЛрдИ рдмрд╛рдд рдирд╣реАрдВ рд╣реЛрдЧреАред

рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╕реНрдереИрддрд┐рдХ рдмреВрд▓ рдмрд░рд╛рдмрд░ (рдСрдмреНрдЬреЗрдХреНрдЯ objA, рдСрдмреНрдЬреЗрдХреНрдЯ objB)

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдпрд╣ рд╡рд┐рдзрд┐ рдкрд╣рдЪрд╛рди рдХреЗ рд▓рд┐рдП рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХрд░рддреА рд╣реИ, рдФрд░ рдпрджрд┐ рдСрдмреНрдЬреЗрдХреНрдЯ рд╕рдорд╛рди рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдЙрдиреНрд╣реЗрдВ рдЕрд╢рдХреНрдд рдХреЗ рд▓рд┐рдП рдЬрд╛рдВрдЪрддрд╛ рд╣реИ рдФрд░ рдкреБрдирд░реНрдирд┐рд░реНрдзрд╛рд░рд┐рдд рдЖрд╡реГрддреНрддрд┐ рд╡рд┐рдзрд┐ рдХреА рддреБрд▓рдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░реА рдХреЛ рдмрд░рд╛рдмрд░ рдХрд░рддрд╛ рд╣реИред

рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╡рд░реНрдЪреБрдЕрд▓ рдмреВрд▓ рдмрд░рд╛рдмрд░ (рдСрдмреНрдЬреЗрдХреНрдЯ obj)

рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рдпрд╣ рд╡рд┐рдзрд┐ рдмрд┐рд▓реНрдХреБрд▓ ReferenceEquals рдХреА рддрд░рд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддреА рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рд╕рд╛рд░реНрдердХ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП, рдпрд╣ System.ValueType рдореЗрдВ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдУрд╡рд░рд░рд╛рдЗрдб рд╣реИ:
 public override bool Equals(object obj) { if (obj == null) { return false; } RuntimeType runtimeType = (RuntimeType)base.GetType(); RuntimeType left = (RuntimeType)obj.GetType(); if (left != runtimeType) { return false; } if (ValueType.CanCompareBits(this)) { return ValueType.FastEqualsCheck(this, obj); } FieldInfo[] fields = runtimeType.GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); for (int i = 0; i < fields.Length; i++) { object obj2 = ((RtFieldInfo)fields[i]).InternalGetValue(this, false); object obj3 = ((RtFieldInfo)fields[i]).InternalGetValue(obj, false); if (obj2 == null) { if (obj3 != null) { return false; } } else { if (!obj2.Equals(obj3)) { return false; } } } return true; } 

рднрдЧрд╡рд╛рди рдХрд┐рд╕реА рдХреЛ рднреА рдмрдбрд╝реЗ рд╕реЗрдЯ рдкрд░ рдЗрд╕ рддрд░рд╣ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдордирд╛ рдХрд░рддреЗ рд╣реИрдВред BCL рдбреЗрд╡рд▓рдкрд░реНрд╕ рдпрд╣ рдирд╣реАрдВ рдЬрд╛рди рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╣рдо рдЗрди рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдЧреНрд░рд┐рдо рд░реВрдк рд╕реЗ рдХреБрдЫ рднреА рдЬрд╛рдиреЗ рдмрд┐рдирд╛ рдкреНрд░рддрд┐рдмрд┐рдВрдм рдХреЗ рдЙрдкрдпреЛрдЧ рд╕реЗ рдЕрдкрдиреЗ рдХреНрд╖реЗрддреНрд░реЛрдВ рджреНрд╡рд╛рд░рд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВрдЧреЗ рдФрд░ рддреБрд▓рдирд╛ рдХрд░реЗрдВрдЧреЗред рдмреЗрд╢рдХ, рдпрд╣ рддреБрд▓рдирд╛ рдХрд╛ рдмрд╣реБрдд рдЙрддреНрдкрд╛рджрдХ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИред рдЗрд╕рд▓рд┐рдП, рд╕рдВрдХрд▓рди рдЪрд░рдг рдореЗрдВ рдЬреНрдЮрд╛рдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, рдЖрдкрдХреЛ рдЗрд╕ рд╡рд┐рдзрд┐ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрд╕реЗ рдмреЗрд╣рддрд░ рдХреМрди рдпрд╣ рдЬрд╛рди рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рд╡рд┐рдХрд╕рд┐рдд рджреЛ рд╡рд╕реНрддреБрдУрдВ рдХреА рддреБрд▓рдирд╛ рдХреИрд╕реЗ рдХреА рдЬрд╛рдП? рд╕рдВрджрд░реНрдн рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП, рдорд╣рддреНрд╡рдкреВрд░реНрдг рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рджреЛ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреА рддреБрд▓рдирд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рдмрд┐рдирд╛, рдЗрд╕ рдкрджреНрдзрддрд┐ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдирд╛ рд╡реИрдХрд▓реНрдкрд┐рдХ рд╣реИред
рдЖрдЗрдП рдЗрд╕ рдкрджреНрдзрддрд┐ рдХреЗ рдПрдХ рд╕рдХреНрд╖рдо рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рди рдХреЗ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЛ рджреЗрдЦреЗрдВ рдФрд░ рддреБрд░рдВрдд IEquatable рдХреЛ рд▓рд╛рдЧреВ рдХрд░реЗрдВ:
 class Vehicle:IEquatable<Vehicle> { protected int speed; public int Speed { get { return this.speed; } set { this.speed = value; } } protected string name; public string Name { get { return this.name; } set { this.name = value; } } public Vehicle(){} public Vehicle(int speed, string name) { this.speed = speed; this.name = name; } public override bool Equals(object other) { //     . //    null  other,  other.GetType()   //NullReferenceException. if (other == null) return false; //        ,    . if (object.ReferenceEquals(this, other)) return true; //          ,    // Vehicle tmp = other as Vehicle; if(tmp==null) return false; //   ,     tmp. if (this.GetType() != other.GetType()) return false; return this.Equals(other as Vehicle); } public bool Equals(Vehicle other) { if (other == null) return false; //    . //  ,            - // . if (object.ReferenceEquals(this, other)) return true; //   ,         , //           . if (this.GetType() != other.GetType()) return false; if (string.Compare(this.Name, other.Name, StringComparison.CurrentCulture) == 0 && this.speed.Equals(other.speed)) return true; else return false; } } 

рд╡рд░реНрдЪреБрдЕрд▓ рд╡рд┐рдзрд┐ рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдкрджрд╛рдиреБрдХреНрд░рдо рдХреЗ рд╢реАрд░реНрд╖ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЯрд┐рдкреНрдкрдгреА рдПрдХ рдХрд╛рд░рдг рд╕реЗ рдХреА рдЬрд╛рддреА рд╣реИред рдпрджрд┐ рдЖрдк рд╡рд╛рд╣рди рд╡рд░реНрдЧ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдмрд╛рдЗрдХ) рдХрд╛ рдПрдХ рдЗрдирд╣реЗрд░реАрдЯрд░ рдмрдирд╛рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ рдПрдХ рдУрд╡рд░рд░рд╛рдЗрдб рд╡рд░реНрдЪреБрдЕрд▓ рдЗрдХреНрд╡рд╛рд▓реНрд╕ рд╡рд┐рдзрд┐ рднреА рд╣реЛрдЧреА, рдЬрд┐рд╕рдореЗрдВ рдЧреЗрдЯрдЯрд╛рдЗрдк рджреНрд╡рд╛рд░рд╛ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреА рддреБрд▓рдирд╛ рдирд╣реАрдВ рдХреА рдЬрд╛рдПрдЧреА, рд▓реЗрдХрд┐рди Bike tmp = other as Bike; if(tmp!=null) this.Equals(tmp); рдбрд╛рд▓рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ Bike tmp = other as Bike; if(tmp!=null) this.Equals(tmp); Bike tmp = other as Bike; if(tmp!=null) this.Equals(tmp); рддрдм рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдирд┐рдореНрди рдХреЛрдб рд╕рдорд╕реНрдпрд╛рдПрдБ рдкреИрджрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
 Vehicle vehicle = new Vehicle(); Bike bike = new Bike(); object vehicleObj = vehicle; object bikeObject = bike; bike.Equals(vehicleObj); //      .  ,   //     


рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╕реНрдерд┐рд░ рдмреВрд▓ рдСрдкрд░реЗрдЯрд░ == (рдлреВ рдмрд╛рдПрдВ, рдлреВ рджрд╛рдПрдВ)

рд╕рд╛рд░реНрдердХ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рд╣рдореЗрд╢рд╛ рд╡рд░реНрдЪреБрдЕрд▓ рд╕рдорд╛рди () рдХреА рддрд░рд╣ рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рд╕рдВрджрд░реНрдн рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП, рдЗрд╕реЗ рдУрд╡рд░рд░рд╛рдЗрдб рдирд╣реАрдВ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐, рд╕рдВрджрд░реНрдн рдкреНрд░рдХрд╛рд░реЛрдВ рдкрд░, == рд╕реЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рд╡реНрдпрд╡рд╣рд╛рд░ рд╕рдВрджрд░реНрднрд╛рдВрдХ () рдкрджреНрдзрддрд┐ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдЕрдкреЗрдХреНрд╖рд┐рдд рд╣реИред рддреЛ, рдпрд╣рд╛рдБ рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рд╣реИред

IStructuralEquatable

IStructuralEquitable IEqualityComparer рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд╕рд╛рде рд╣рд╛рде рдореЗрдВ рд╣рд╛рде рдЬрд╛рддрд╛ рд╣реИред IStructuralEquitable рдЗрдВрдЯрд░рдлрд╝реЗрд╕, System.Array рдпрд╛ System.Tuple рдЬреИрд╕реА рдХрдХреНрд╖рд╛рдУрдВ рджреНрд╡рд╛рд░рд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдмрд┐рд▓ рд╡реИрдЧрдирд░ рдХреЗ рдЕрдиреБрд╕рд╛рд░, IStructuralEquality рдШреЛрд╖рдгрд╛ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдПрдХ рдкреНрд░рдХрд╛рд░ рдмрдбрд╝реА рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рдЧрдарди рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╢рдмреНрджрд╛рд░реНрде рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдпрд╣ рд╕рдВрднрд╛рд╡рдирд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдХрднреА рднреА рдЗрд╕реЗ рд╕реНрд╡рдпрдВ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЗрд╕рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдХреНрдпрд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ? рдХреЗрд╡рд▓ System.Array рдореЗрдВ рдЗрд╕рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рджреЗрдЦреЗрдВ:
 bool IStructuralEquatable.Equals(object other, IEqualityComparer comparer) { if (other == null) { return false; } if (object.ReferenceEquals(this, other)) { return true; } Array array = other as Array; if (array == null || array.Length != this.Length) { return false; } for (int i = 0; i < array.Length; i++) { object value = this.GetValue(i); object value2 = array.GetValue(i); if (!comparer.Equals(value, value2)) { return false; } } return true; } 

рджрд░рдЕрд╕рд▓, рд╡рд╕реНрддреБрдУрдВ рдХреА рдкрд╣рдЪрд╛рди рдХреЛ рдкрд╣рд▓реЗ рдЬрд╛рдВрдЪрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдлрд┐рд░ рдЙрдиреНрд╣реЗрдВ рдЙрд╕реА рдкреНрд░рдХрд╛рд░ рдХрд╛ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рд▓рдВрдмрд╛рдИ рдХреА рддреБрд▓рдирд╛ рдХреА рдЬрд╛рддреА рд╣реИред рдпрджрд┐ рд▓рдВрдмрд╛рдИ рдмрд░рд╛рдмрд░ рд╣реИ, рддреЛ рд╕рдорд╛рди рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╡рд┐рдзрд┐ (IEqualityComparent) рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЗрд╕рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░реА рд╕реМрдВрдкрдХрд░ рддрддреНрд╡рд╡рд╛рдЪрдХ рддреБрд▓рдирд╛ рд╢реБрд░реВ рд╣реЛрддреА рд╣реИред

рдпрд╣ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рд╡рд╣ рд╕рдм рд╣реИ рдЬреЛ C # .NET рдореЗрдВ рд╡рд╕реНрддреБрдУрдВ рдХреА рддреБрд▓рдирд╛ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХрд╣рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рдФрд░ рдЫреЛрдЯрд╛ рд▓реЗрдХрд┐рди рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╡рд┐рд╡рд░рдг рд░рд╣рддрд╛ рд╣реИ: GetHashCode () рд╡рд┐рдзрд┐ред

рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╡рд░реНрдЪреБрдЕрд▓ int GetHashCode ()

рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдЗрд╕ рдкрджреНрдзрддрд┐ рдХрд╛ рдорд╛рдирдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдЬрдирд░реЗрдЯрд░ рдХреА рддрд░рд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдиреБрдХрд╕рд╛рди рдпрд╣ рд╣реИ рдХрд┐ рдПрдХ рд╣реА рд╢рдмреНрджрд╛рд░реНрде рд╡рд╕реНрддреБ рд╡рд┐рднрд┐рдиреНрди рд╣реИрд╢ рдорд╛рдиреЛрдВ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░ рд╕рдХрддреА рд╣реИред рд░рд┐рдХреНрдЯрд░ рдХреА рд╢рд┐рдХрд╛рдпрдд рд╣реИ рдХрд┐ рдорд╛рдирдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рднреА рдЦрд░рд╛рдм рдкреНрд░рджрд░реНрд╢рди рдХрд░ рд░рд╣рд╛ рд╣реИред рдЗрд╕ рдкрджреНрдзрддрд┐ рдХрд╛ рдПрдХ рд╕рдХреНрд╖рдо рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдмрд╣реБрдд рд╕рдорд╕реНрдпрд╛рдЧреНрд░рд╕реНрдд рд╣реИред рд╣рд╢ рдХреА рдЬрд▓реНрджреА рд╕реЗ рдЧрдгрдирд╛ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдПрдХ рдмрдбрд╝рд╛ рдкреНрд░рд╕рд╛рд░ рд╣реЛрддрд╛ рд╣реИ рддрд╛рдХрд┐ рдкрд░реНрдпрд╛рдкреНрдд рдмрдбрд╝реЗ рд╕реЗрдЯреЛрдВ рдкрд░ рдХреЛрдИ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рди рд╣реЛред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЬреНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, GetHashCode () рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИред рд╣рд░ рдЬрдЧрд╣ рдмрджрд▓рд╛рд╡ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, "рдмрд┐рдЯрд╡рд╛рдЗрдЬрд╝ рдпрд╛" рдпрд╛ "рдПрдХреНрд╕рдХреНрд▓реВрд╕рд┐рд╡ рдпрд╛ред" рд░рд┐рдХреНрдЯрд░ рд╕реНрд╡рдпрдВ рдПрдХ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд╕рд╛рде рдПрдХ рдЙрджрд╛рд╣рд░рдг рджреЗрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рджреЛ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЗрдВрдЯ рд╣реЛрддреЗ рд╣реИрдВред GetHashCode () рдпрд╣ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреЗрддрд╛ рд╣реИ:
 internal sealed class Point { private int a; private int b; public override int GetHashCode() { return a ^ b; } } 

рдФрд░ рдпрд╣рд╛рдБ рдХреИрд╕реЗ GetHasCode () рдХреЛ System.Char рдореЗрдВ рдкреБрдирдГ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
 public override int GetHashCode() { return (int)this | (int)this << 16; } 

рдХрдИ рдЙрджрд╛рд╣рд░рдг рджрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдЕрдиреБрдорд╛рдиреА рд╕рдВрдХреЗрддрдХреЛрдВ рдХреЛ рд▓рдЧрднрдЧ рд╣рд░ рдЬрдЧрд╣ рдкрд╛рд▓реА рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рдмрд╛рд╣рд░ рдпрд╛ рдЗрддрдиреЗ рдкрд░ред

рдПрдХ рд▓реЗрдЦ рд▓рд┐рдЦрддреЗ рд╕рдордп, рдкреНрд░рд╕рд┐рджреНрдз рд╕реНрд░реЛрддреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛:
рд╕реАред рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬреЗред рд░рд┐рдХреНрдЯрд░, рд╕реАрдПрд▓рдЖрд░
рдмреАред рд╡реИрдЧрдирд░ рдкреНрд░рднрд╛рд╡реА рд╕реА #
рдореИрдВрдиреЗ рдЗрдВрдЯрд░рдиреЗрдЯ рдкрд░ рдЕрдкрдиреЗ рдЕрдиреБрднрд╡ рдФрд░ рд╕реНрд░реЛрддреЛрдВ рдХрд╛ рднреА рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛, рдЬрд┐рд╕рдХрд╛ рдЬреНрдпрд╛рджрд╛ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИред


рдпрд╣рд╛рдБ рдЕрдиреБрд╡рд╛рдж рдХрд░реЗрдВ

Source: https://habr.com/ru/post/In137680/


All Articles