Record-जैसे types और value-based equality (पैटर्न)
records की तरह value-based equality लागू कीजिए: Equals/GetHashCode को override कीजिए, IEquatable लागू कीजिए, ==/!= operators जोड़िए और types को immutable रखिए।
Record-जैसे types और value-based equality (पैटर्न), CoddyKit पर C# अकादमी का एक निःशुल्क पाठ है। यह 3 में से 2वाँ पाठ है। आप नीचे पूरा पाठ निःशुल्क पढ़ सकते हैं—फिर अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर के साथ ब्राउज़र में इसका व्यावहारिक अभ्यास कर सकते हैं। यह C# अकादमी सीखने के मार्ग का हिस्सा है और आपकी प्रगति वेब तथा CoddyKit ऐप पर सिंक होती रहती है। C# अकादमी पाठ्यक्रम में कुल 3 पाठ शामिल हैं।
रिकॉर्ड-जैसा अवलोकन
लक्ष्य: C# 6 में ऑब्जेक्ट की तुलना मान के आधार पर करें (रिकॉर्ड-जैसा)।
- अपरिवर्तनीय डेटा
- Equals और GetHashCode को override करें
- IEquatable<T> लागू करें
- वैकल्पिक: ==/!= परिभाषित करें
reference समानता की समस्या
क्लास की तुलना डिफ़ॉल्ट रूप से reference के आधार पर होती है। समान डेटा वाले दो ऑब्जेक्ट समान नहीं होते।
using System;
public class PersonRef
{
public string First;
public string Last;
}
public class Program
{
public static void Main(string[] args)
{
PersonRef a = new PersonRef { First = "Ada", Last = "Lovelace" };
PersonRef b = new PersonRef { First = "Ada", Last = "Lovelace" };
Console.WriteLine("Reference Equals? " + object.ReferenceEquals(a, b)); // false
Console.WriteLine("== (default)? " + (a == b)); // false (same as ReferenceEquals for classes)
}
}
रिकॉर्ड-जैसा क्लास pattern
क्लास को अपरिवर्तनीय बनाएँ और IEquatable<T>, Equals, GetHashCode तथा ==/!= लागू करें, ताकि समानता डेटा पर निर्भर हो।
using System;
// Immutable, value-based equality
public sealed class Person : IEquatable<Person>
{
public string First { get; private set; }
public string Last { get; private set; }
public Person(string first, string last)
{
if (string.IsNullOrEmpty(first)) throw new ArgumentException("first");
if (string.IsNullOrEmpty(last)) throw new ArgumentException("last");
First = first; Last = last;
}
// "With" helper for copy-on-change
public Person WithFirst(string first) { return new Person(first, Last); }
public Person WithLast(string last) { return new Person(First, last); }
public bool Equals(Person other)
{
if (object.ReferenceEquals(other, null)) return false;
if (object.ReferenceEquals(this, other)) return true;
return string.Equals(First, other.First) && string.Equals(Last, other.Last);
}
public override bool Equals(object obj)
{
return Equals(obj as Person);
}
public override int GetHashCode()
{
unchecked
{
int h = 17;
h = h * 31 + (First == null ? 0 : First.GetHashCode());
h = h * 31 + (Last == null ? 0 : Last.GetHashCode());
return h;
}
}
public static bool operator ==(Person a, Person b)
{
if (object.ReferenceEquals(a, b)) return true;
if ((object)a == null || (object)b == null) return false;
return a.Equals(b);
}
public static bool operator !=(Person a, Person b) { return !(a == b); }
}
public class Program
{
public static void Main(string[] args)
{
Person p1 = new Person("Ada", "Lovelace");
Person p2 = new Person("Ada", "Lovelace");
Console.WriteLine("Value Equals? " + (p1 == p2)); // true
Person p3 = p1.WithLast("King");
Console.WriteLine("After With: " + (p1 == p3)); // false
}
}
स्ट्रक्चर समानता pattern
स्ट्रक्चर डिफ़ॉल्ट रूप से ValueType.Equals के ज़रिए fields की तुलना करते हैं, लेकिन IEquatable<T> लागू करने से उद्देश्य और हैशिंग स्पष्ट हो जाती है।
using System;
public struct Point2 : IEquatable<Point2>
{
public int X;
public int Y;
public Point2(int x, int y) { X = x; Y = y; }
public bool Equals(Point2 other)
{
return X == other.X && Y == other.Y;
}
public override bool Equals(object obj)
{
if (!(obj is Point2)) return false;
return Equals((Point2)obj);
}
public override int GetHashCode()
{
unchecked { return (X * 397) ^ Y; }
}
public static bool operator ==(Point2 a, Point2 b) { return a.Equals(b); }
public static bool operator !=(Point2 a, Point2 b) { return !a.Equals(b); }
}
public class Program
{
public static void Main(string[] args)
{
Point2 a = new Point2(1, 2);
Point2 b = new Point2(1, 2);
Console.WriteLine("Struct value equality: " + (a == b)); // true
}
}
कुंजी के रूप में मान ऑब्जेक्ट
जब कोई मान ऑब्जेक्ट Dictionary की कुंजी होता है, तो सही Equals/GetHashCode यह सुनिश्चित करता है कि खोज सफल हो।
using System;
using System.Collections.Generic;
public sealed class Email : IEquatable<Email>
{
public string Address { get; private set; }
public Email(string address)
{
if (string.IsNullOrEmpty(address)) throw new ArgumentException("address");
Address = address.Trim().ToLowerInvariant();
}
public bool Equals(Email other)
{
if (object.ReferenceEquals(other, null)) return false;
return Address == other.Address;
}
public override bool Equals(object obj) { return Equals(obj as Email); }
public override int GetHashCode()
{
return Address == null ? 0 : Address.GetHashCode();
}
}
public class Program
{
public static void Main(string[] args)
{
Dictionary<Email, string> owners = new Dictionary<Email, string>();
owners[new Email("User@Mail.com")] = "Ada";
Console.WriteLine(owners.ContainsKey(new Email("user@mail.com"))); // true
}
}
समानता की जाँच-सूची
जाँच-सूची:
- डेटा को अपरिवर्तनीय रखें।
- Equals और GetHashCode को override करें।
- प्रकार-सुरक्षित और तेज़ तुलना के लिए IEquatable<T> लागू करें।
- सुविधा के लिए ==/!= जोड़ें।
- समानता और हैशिंग, दोनों में एक जैसे fields का उपयोग करें।
रिकॉर्ड-जैसी समानता की आवश्यकता
पुनरावृत्ति
पुनरावृत्ति: C# 6 में आप रिकॉर्ड-जैसे प्रकार हाथ से बनाते हैं: अपरिवर्तनीय डेटा, IEquatable<T>, सही Equals/GetHashCode और (वैकल्पिक रूप से) ==/!=। इनका सेट और डिक्शनरी में सुरक्षित रूप से उपयोग करें।
एआई शिक्षक के साथ C# सीखें — निःशुल्क
अपने ब्राउज़र में वास्तविक कोड लिखें और चलाएँ, चौबीसों घंटे एआई शिक्षक से तुरंत सहायता पाएँ, और वेब या ऐप पर वहीं से शुरू करें जहाँ आपने छोड़ा था।
- पाठ्यक्रम
- 93
- पाठ
- 346
अक्सर पूछे जाने वाले प्रश्न
क्या “Record-जैसे types और value-based equality (पैटर्न)” पाठ निःशुल्क है?
हाँ—“Record-जैसे types और value-based equality (पैटर्न)” का पूरा पाठ यहाँ वेब पर निःशुल्क पढ़ा जा सकता है। इंटरैक्टिव अभ्यास (अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर) करने और C# अकादमी पाठ्यक्रम का बाकी हिस्सा अनलॉक करने के लिए CoddyKit PRO लें। C# अकादमी पाठ्यक्रम में कुल 3 पाठ शामिल हैं।
“Record-जैसे types और value-based equality (पैटर्न)” में मैं क्या सीखूँगा?
records की तरह value-based equality लागू कीजिए: Equals/GetHashCode को override कीजिए, IEquatable लागू कीजिए, ==/!= operators जोड़िए और types को immutable रखिए। आप ब्राउज़र में सीधे चलाए जाने वाले व्यावहारिक कोड के साथ C# अकादमी का अभ्यास करते हैं, और पाठ पूरा करते समय 24/7 एआई ट्यूटर आपके प्रश्नों के उत्तर देता है।
क्या C# अकादमी शुरू करने के लिए मुझे किसी अनुभव की आवश्यकता है?
पहले के अनुभव की आवश्यकता नहीं है। CoddyKit पर C# अकादमी शुरुआती से लेकर उन्नत शिक्षार्थियों तक सभी के लिए व्यवस्थित किया गया है, इसलिए आप यहीं से या शुरुआत से सीखना शुरू कर सकते हैं और अपनी गति से आगे बढ़ सकते हैं। यह 3 में से 2वाँ पाठ है।
“Record-जैसे types और value-based equality (पैटर्न)” पाठ पूरा करने में कितना समय लगता है?
CoddyKit का अधिकांश पाठ लगभग 5–10 मिनट में पूरा हो जाता है। हर पाठ छोटा और संवादात्मक है, इसलिए आप लगातार प्रगति करते हैं और वेब या ऐप पर वहीं से सीखना जारी रख सकते हैं जहाँ आपने छोड़ा था।
क्या मैं इस C# अकादमी पाठ में कोड लिख और चला सकता हूँ?
हाँ। हर C# अकादमी पाठ में एक अंतर्निर्मित कोड संपादक शामिल है, जिससे आप सीधे अपने ब्राउज़र में वास्तविक कोड लिख और चला सकते हैं और तुरंत एआई प्रतिक्रिया पा सकते हैं—स्थानीय सेटअप की आवश्यकता नहीं है।
इस पाठ्यक्रम के सभी पाठ
- Structs: value semantics और immutability pattern
- Record-जैसे types और value-based equality (पैटर्न)
- Enums और [Flags]