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

तुलना ऑपरेटर ओवरलोड करना

==, != और क्रम निर्धारण ऑपरेटर लागू करें।

पाठ 2, कुल 4 में से13 चरण

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

तुलना ऑपरेटर और समानता

जब आप == को ओवरलोड करते हैं, तो != को भी ओवरलोड करना आवश्यक है। सभी प्रकार की समानता को सुसंगत रखने के लिए आपको Equals और GetHashCode को भी ओवरराइड करना चाहिए। C# कंपाइल-टाइम पर ऑपरेटरों की इस जोड़ी को लागू करता है।

== और != को ओवरलोड करना

कंपाइलर के लिए == और != को साथ-साथ परिभाषित करना आवश्यक है। प्रत्येक यह बताने वाला bool लौटाता है कि ऑपरैंड समान माने जाते हैं या नहीं।

using System;

public struct Point
{
    public int X, Y;
    public Point(int x, int y) { X = x; Y = y; }

    public static bool operator ==(Point a, Point b) => a.X == b.X && a.Y == b.Y;
    public static bool operator !=(Point a, Point b) => !(a == b);

    public override bool Equals(object obj) => obj is Point p && this == p;
    public override int GetHashCode() => HashCode.Combine(X, Y);
}

public class Program
{
    public static void Main()
    {
        Console.WriteLine(new Point(1, 2) == new Point(1, 2));
        Console.WriteLine(new Point(1, 2) != new Point(3, 4));
    }
}

Equals को भी हमेशा ओवरराइड करें

ऑपरेटरों का समाधान कंपाइल-टाइम पर स्थैतिक प्रकार के आधार पर होता है, लेकिन Equals आभासी है और संग्रहों द्वारा उपयोग किया जाता है। Equals को ओवरराइड करें, ताकि शब्दकोश और List.Contains आपके == से सहमत हों।

using System;

public struct Point
{
    public int X, Y;
    public Point(int x, int y) { X = x; Y = y; }
    public static bool operator ==(Point a, Point b) => a.X == b.X && a.Y == b.Y;
    public static bool operator !=(Point a, Point b) => !(a == b);
    public override bool Equals(object obj) => obj is Point p && this == p;
    public override int GetHashCode() => HashCode.Combine(X, Y);
}

public class Program
{
    public static void Main()
    {
        object a = new Point(1, 2);
        object b = new Point(1, 2);
        Console.WriteLine(a.Equals(b));
    }
}

GetHashCode को समानता से मेल खाना चाहिए

यदि दो मान समान हैं, तो उन्हें समान हैश कोड लौटाना चाहिए। अन्यथा Dictionary और HashSet जैसे हैश-आधारित संग्रह गलत व्यवहार करेंगे।

using System;
using System.Collections.Generic;

public struct Point
{
    public int X, Y;
    public Point(int x, int y) { X = x; Y = y; }
    public static bool operator ==(Point a, Point b) => a.X == b.X && a.Y == b.Y;
    public static bool operator !=(Point a, Point b) => !(a == b);
    public override bool Equals(object obj) => obj is Point p && this == p;
    public override int GetHashCode() => HashCode.Combine(X, Y);
}

public class Program
{
    public static void Main()
    {
        var set = new HashSet<Point> { new Point(1, 2) };
        Console.WriteLine(set.Contains(new Point(1, 2)));
    }
}

क्रम-निर्धारण ऑपरेटर < और >

आप संबंधपरक ऑपरेटरों को भी ओवरलोड कर सकते हैं। समानता की तरह, < और > को साथ-साथ परिभाषित करना आवश्यक है, और यही बात <= तथा >= पर भी लागू होती है।

using System;

public struct Weight
{
    public int Grams;
    public Weight(int g) { Grams = g; }

    public static bool operator <(Weight a, Weight b) => a.Grams < b.Grams;
    public static bool operator >(Weight a, Weight b) => a.Grams > b.Grams;

    public override string ToString() => Grams + "g";
}

public class Program
{
    public static void Main()
    {
        Console.WriteLine(new Weight(100) < new Weight(200));
        Console.WriteLine(new Weight(300) > new Weight(200));
    }
}

संदर्भ प्रकारों के लिए समानता

क्लासों के लिए मान-समानता का अर्थ संदर्भों के बजाय फ़ील्ड की तुलना करना है। ऑपरेटर के भीतर अपवाद आने से बचने के लिए null को सावधानी से संभालें।

using System;

public class Person
{
    public string Name;
    public Person(string name) { Name = name; }

    public static bool operator ==(Person a, Person b)
    {
        if (ReferenceEquals(a, b)) return true;
        if (a is null || b is null) return false;
        return a.Name == b.Name;
    }
    public static bool operator !=(Person a, Person b) => !(a == b);
    public override bool Equals(object obj) => this == (obj as Person);
    public override int GetHashCode() => Name?.GetHashCode() ?? 0;
}

public class Program
{
    public static void Main()
    {
        Console.WriteLine(new Person("Ann") == new Person("Ann"));
    }
}

सभी रूपों में संगति

समानता के सभी मार्गों को सहमत होना चाहिए: ==, Equals और हैश कोड। == को Equals के आधार पर लागू करें, या इसके विपरीत, ताकि सत्य का एक ही स्रोत रहे।

using System;

public struct Id
{
    public int Value;
    public Id(int value) { Value = value; }
    public bool Equals(Id other) => Value == other.Value;
    public override bool Equals(object obj) => obj is Id other && Equals(other);
    public override int GetHashCode() => Value;
    public static bool operator ==(Id a, Id b) => a.Equals(b);
    public static bool operator !=(Id a, Id b) => !a.Equals(b);
}

public class Program
{
    public static void Main()
    {
        Console.WriteLine(new Id(7) == new Id(7));
        Console.WriteLine(new Id(7).Equals(new Id(8)));
    }
}

संग्रहों में ऑपरेटर बनाम Equals

List में खोज == के बजाय Equals का उपयोग करती है, क्योंकि वह object संदर्भों के साथ काम करती है। यदि आप केवल == को ओवरलोड करके Equals को भूल जाते हैं, तो खोज संदर्भ-पहचान का उपयोग करेगी और विफल हो सकती है।

using System;
using System.Collections.Generic;

public struct Tag
{
    public string Name;
    public Tag(string name) { Name = name; }
    public override bool Equals(object obj) => obj is Tag t && t.Name == Name;
    public override int GetHashCode() => Name?.GetHashCode() ?? 0;
    public static bool operator ==(Tag a, Tag b) => a.Equals(b);
    public static bool operator !=(Tag a, Tag b) => !a.Equals(b);
}

public class Program
{
    public static void Main()
    {
        var list = new List<Tag> { new Tag("red"), new Tag("blue") };
        Console.WriteLine(list.Contains(new Tag("blue")));
    }
}

कंपाइलर चेतावनियों को उचित रूप से दबाना

ऑपरेटरों के साथ Equals और GetHashCode को ओवरराइड करना केवल शिष्टाचार नहीं है; यदि आप Equals को ओवरराइड किए बिना == को ओवरलोड करते हैं, तो कंपाइलर चेतावनी देता है। दोनों करने से चेतावनी हटती है और बग से बचाव होता है।

using System;

public struct Cell
{
    public int Row, Col;
    public Cell(int r, int c) { Row = r; Col = c; }
    public override bool Equals(object obj) => obj is Cell c && c.Row == Row && c.Col == Col;
    public override int GetHashCode() => HashCode.Combine(Row, Col);
    public static bool operator ==(Cell a, Cell b) => a.Equals(b);
    public static bool operator !=(Cell a, Cell b) => !a.Equals(b);
}

public class Program
{
    public static void Main()
    {
        Console.WriteLine(new Cell(0, 0) == new Cell(0, 0));
    }
}

सब कुछ एक साथ

एक अच्छी तरह व्यवहार करने वाला समानता-सक्षम प्रकार == और != परिभाषित करता है, Equals और GetHashCode को ओवरराइड करता है, और इन सभी को एक ही तुलना के माध्यम से चलाता है। मान-सदृश प्रकारों के लिए यही आदर्श मानक है।

using System;
using System.Collections.Generic;

public struct Color
{
    public int R, G, B;
    public Color(int r, int g, int b) { R = r; G = g; B = b; }
    public override bool Equals(object obj) => obj is Color c && c.R == R && c.G == G && c.B == B;
    public override int GetHashCode() => HashCode.Combine(R, G, B);
    public static bool operator ==(Color a, Color b) => a.Equals(b);
    public static bool operator !=(Color a, Color b) => !a.Equals(b);
}

public class Program
{
    public static void Main()
    {
        var dict = new Dictionary<Color, string> { [new Color(255, 0, 0)] = "red" };
        Console.WriteLine(dict[new Color(255, 0, 0)]);
    }
}

स्वयं आज़माएँ

पूरी तरह सुसंगत समानता-सक्षम संरचना लागू करें और एक साथ जाँचें कि वह शब्दकोश की कुंजी तथा == ऑपरेटर के साथ सही काम करती है।

using System;
using System.Collections.Generic;

public struct GridPos
{
    public int Row, Col;
    public GridPos(int r, int c) { Row = r; Col = c; }
    public override bool Equals(object obj) => obj is GridPos p && p.Row == Row && p.Col == Col;
    public override int GetHashCode() => HashCode.Combine(Row, Col);
    public static bool operator ==(GridPos a, GridPos b) => a.Equals(b);
    public static bool operator !=(GridPos a, GridPos b) => !a.Equals(b);
}

public class Program
{
    public static void Main()
    {
        var grid = new Dictionary<GridPos, string> { [new GridPos(1, 1)] = "player" };
        Console.WriteLine(new GridPos(1, 1) == new GridPos(1, 1));
        Console.WriteLine(grid[new GridPos(1, 1)]);
    }
}

त्वरित जाँच

समानता को ओवरलोड करने के नियम याद करें।

पुनरावलोकन

तुलना ऑपरेटरों की ओवरलोडिंग में संगति आवश्यक है।

  • == और != को साथ-साथ परिभाषित करना आवश्यक है; इसी तरह </> को भी।
  • == से मेल कराने के लिए Equals और GetHashCode को ओवरराइड करें।
  • समान मानों का हैश कोड एक जैसा होना चाहिए।
  • असंगति से बचने के लिए सभी समानता-जाँच को एक ही तुलना-विधि के माध्यम से चलाएँ।
शुरुआत निःशुल्क

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

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

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

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

क्या “तुलना ऑपरेटर ओवरलोड करना” पाठ निःशुल्क है?

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

“तुलना ऑपरेटर ओवरलोड करना” में मैं क्या सीखूँगा?

==, != और क्रम निर्धारण ऑपरेटर लागू करें। आप ब्राउज़र में सीधे चलाए जाने वाले व्यावहारिक कोड के साथ C# अकादमी का अभ्यास करते हैं, और पाठ पूरा करते समय 24/7 एआई ट्यूटर आपके प्रश्नों के उत्तर देता है।

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

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

“तुलना ऑपरेटर ओवरलोड करना” पाठ पूरा करने में कितना समय लगता है?

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

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

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

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

  1. अंकगणितीय ऑपरेटर ओवरलोड करना
  2. तुलना ऑपरेटर ओवरलोड करना
  3. उपयोगकर्ता-परिभाषित रूपांतरण
  4. ऑपरेटर ओवरलोडिंग की सर्वोत्तम प्रथाएँ
← C# अकादमी पर वापस जाएँ