C# अकादमी · पाठ

Equality और hashing (value बनाम reference)

reference equality और value equality समझें, Equals/GetHashCode को सही ढंग से override करें, IEquatable लागू करें और sets/dictionaries में custom comparers का उपयोग करें।

पाठ 3, कुल 3 में से8 चरण

Equality और hashing (value बनाम reference), CoddyKit पर C# अकादमी का एक निःशुल्क पाठ है। यह 3 में से 3वाँ पाठ है। आप नीचे पूरा पाठ निःशुल्क पढ़ सकते हैं—फिर अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर के साथ ब्राउज़र में इसका व्यावहारिक अभ्यास कर सकते हैं। यह C# अकादमी सीखने के मार्ग का हिस्सा है और आपकी प्रगति वेब तथा CoddyKit ऐप पर सिंक होती रहती है। C# अकादमी पाठ्यक्रम में कुल 3 पाठ शामिल हैं।

समानता की मूल बातें

लक्ष्य: समानता को आपकी अपेक्षा के अनुसार कार्यशील बनाना।

  • संदर्भ बनाम मान समानता
  • Equals + GetHashCode अनुबंध
  • गति के लिए IEquatable<T>
  • जब आप प्रकार को संशोधित नहीं कर सकते, तब कस्टम तुलनाकर्ता

संदर्भ समानता की समस्या

क्लासों में डिफ़ॉल्ट रूप से संदर्भ समानता होती है। समान डेटा वाली दो अलग-अलग ऑब्जेक्ट समान नहीं मानी जातीं, जब तक आप मान समानता लागू न करें।

using System;
using System.Collections.Generic;

public sealed class Point // no overrides
{
  public int X;
  public int Y;
  public Point(int x, int y){ X = x; Y = y; }
}

public class Program
{
  public static void Main(string[] args)
  {
    Point a = new Point(1, 2);
    Point b = new Point(1, 2);

    Console.WriteLine("a == b ? " + (a == b)); // reference equality: False
    Console.WriteLine("a.Equals(b) ? " + a.Equals(b)); // False

    HashSet<Point> set = new HashSet<Point>();
    set.Add(a);
    Console.WriteLine("Contains b? " + set.Contains(b)); // False (unexpected)
  }
}

मान समानता लागू की गई

IEquatable<T> लागू करें और Equals तथा GetHashCode को ओवरराइड करें। हैश को समानता से मेल खाना चाहिए: समान ऑब्जेक्ट → समान हैश।

using System;
using System.Collections.Generic;

public sealed class ValuePoint : IEquatable<ValuePoint>
{
  public int X;
  public int Y;
  public ValuePoint(int x, int y){ X = x; Y = y; }

  public bool Equals(ValuePoint other)
  {
    if (ReferenceEquals(other, null)) return false;
    if (ReferenceEquals(this, other)) return true;
    return X == other.X && Y == other.Y;
  }

  public override bool Equals(object obj)
  {
    return Equals(obj as ValuePoint);
  }

  public override int GetHashCode()
  {
    // Simple, stable combination (avoid randomness)
    unchecked
    {
      int hash = 17;
      hash = hash * 31 + X.GetHashCode();
      hash = hash * 31 + Y.GetHashCode();
      return hash;
    }
  }
}

public class Program
{
  public static void Main(string[] args)
  {
    ValuePoint a = new ValuePoint(1, 2);
    ValuePoint b = new ValuePoint(1, 2);

    Console.WriteLine("a.Equals(b)? " + a.Equals(b)); // True

    HashSet<ValuePoint> set = new HashSet<ValuePoint>();
    set.Add(a);
    Console.WriteLine("Contains b? " + set.Contains(b)); // True (value semantics)
  }
}

कस्टम तुलनाकर्ता

जब आप स्वयं प्रकार को बदल नहीं सकते, तब IEqualityComparer<T> का कस्टम कार्यान्वयन HashSet/Dictionary को दें।

using System;
using System.Collections.Generic;

public sealed class Person // imagine from a library; cannot edit
{
  public string Name;
  public int BirthYear;
  public Person(string name, int year){ Name = name; BirthYear = year; }
}

public sealed class PersonComparer : IEqualityComparer<Person>
{
  public bool Equals(Person a, Person b)
  {
    if (ReferenceEquals(a, b)) return true;
    if (ReferenceEquals(a, null) || ReferenceEquals(b, null)) return false;
    return a.Name == b.Name && a.BirthYear == b.BirthYear;
  }

  public int GetHashCode(Person p)
  {
    if (ReferenceEquals(p, null)) return 0;
    unchecked
    {
      int h = 23;
      h = h * 31 + (p.Name == null ? 0 : p.Name.GetHashCode());
      h = h * 31 + p.BirthYear.GetHashCode();
      return h;
    }
  }
}

public class Program
{
  public static void Main(string[] args)
  {
    Person p1 = new Person("Ada", 1815);
    Person p2 = new Person("Ada", 1815);

    HashSet<Person> set = new HashSet<Person>(new PersonComparer());
    set.Add(p1);
    Console.WriteLine("Contains p2? " + set.Contains(p2)); // True via comparer
  }
}

अनुबंध और समस्याएँ

नियम:

  • यदि Equals(a,b) सत्य है ⇒ GetHashCode(a) == GetHashCode(b)
  • समानता परावर्ती, सममित और संक्रामक होनी चाहिए
  • जहाँ संभव हो, हैशिंग के लिए अपरिवर्तनीय फ़ील्ड का उपयोग करें
  • GetHashCode में यादृच्छिक मानों का उपयोग न करें

संरचना बनाम क्लास का नोट

संरचनाएँ डिफ़ॉल्ट रूप से फ़ील्ड के आधार पर तुलना करती हैं (मान-आधारित व्यवहार)। क्लासें संदर्भ के आधार पर तुलना करती हैं, जब तक आप मान समानता लागू न करें।

using System;

public struct PointS // struct: value type
{
  public int X;
  public int Y;
  public PointS(int x, int y){ X = x; Y = y; }
}

public class Program
{
  public static void Main(string[] args)
  {
    PointS a = new PointS(1, 2);
    PointS b = new PointS(1, 2);
    Console.WriteLine("Struct equality: " + a.Equals(b)); // True by default (field-wise)
  }
}

संग्रहों के लिए समानता अनुबंध

त्वरित जाँच: HashSet और Dictionary में काम करने वाली मान समानता किसी क्लास को देने के लिए आपको क्या लागू करना चाहिए?

पुनरावलोकन

पुनरावलोकन: मान-आधारित व्यवहार के लिए क्लासों को Equals/GetHashCode और अक्सर IEquatable<T> की आवश्यकता होती है; जब प्रकार संपादित नहीं किए जा सकते, तब कस्टम तुलनाकर्ताओं का उपयोग करें।

शुरुआत निःशुल्क

एआई शिक्षक के साथ C# सीखें — निःशुल्क

अपने ब्राउज़र में वास्तविक कोड लिखें और चलाएँ, चौबीसों घंटे एआई शिक्षक से तुरंत सहायता पाएँ, और वेब या ऐप पर वहीं से शुरू करें जहाँ आपने छोड़ा था।

पाठ्यक्रम
93
पाठ
346

अक्सर पूछे जाने वाले प्रश्न

क्या “Equality और hashing (value बनाम reference)” पाठ निःशुल्क है?

हाँ—“Equality और hashing (value बनाम reference)” का पूरा पाठ यहाँ वेब पर निःशुल्क पढ़ा जा सकता है। इंटरैक्टिव अभ्यास (अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर) करने और C# अकादमी पाठ्यक्रम का बाकी हिस्सा अनलॉक करने के लिए CoddyKit PRO लें। C# अकादमी पाठ्यक्रम में कुल 3 पाठ शामिल हैं।

“Equality और hashing (value बनाम reference)” में मैं क्या सीखूँगा?

reference equality और value equality समझें, Equals/GetHashCode को सही ढंग से override करें, IEquatable लागू करें और sets/dictionaries में custom comparers का उपयोग करें। आप ब्राउज़र में सीधे चलाए जाने वाले व्यावहारिक कोड के साथ C# अकादमी का अभ्यास करते हैं, और पाठ पूरा करते समय 24/7 एआई ट्यूटर आपके प्रश्नों के उत्तर देता है।

क्या C# अकादमी शुरू करने के लिए मुझे किसी अनुभव की आवश्यकता है?

पहले के अनुभव की आवश्यकता नहीं है। CoddyKit पर C# अकादमी शुरुआती से लेकर उन्नत शिक्षार्थियों तक सभी के लिए व्यवस्थित किया गया है, इसलिए आप यहीं से या शुरुआत से सीखना शुरू कर सकते हैं और अपनी गति से आगे बढ़ सकते हैं। यह 3 में से 3वाँ पाठ है।

“Equality और hashing (value बनाम reference)” पाठ पूरा करने में कितना समय लगता है?

CoddyKit का अधिकांश पाठ लगभग 5–10 मिनट में पूरा हो जाता है। हर पाठ छोटा और संवादात्मक है, इसलिए आप लगातार प्रगति करते हैं और वेब या ऐप पर वहीं से सीखना जारी रख सकते हैं जहाँ आपने छोड़ा था।

क्या मैं इस C# अकादमी पाठ में कोड लिख और चला सकता हूँ?

हाँ। हर C# अकादमी पाठ में एक अंतर्निर्मित कोड संपादक शामिल है, जिससे आप सीधे अपने ब्राउज़र में वास्तविक कोड लिख और चला सकते हैं और तुरंत एआई प्रतिक्रिया पा सकते हैं—स्थानीय सेटअप की आवश्यकता नहीं है।

इस पाठ्यक्रम के सभी पाठ

  1. HashSet , SortedSet , Queue , Stack
  2. ConcurrentDictionary , immutable collections
  3. Equality और hashing (value बनाम reference)
← C# अकादमी पर वापस जाएँ