C# Academy · درس

الأنواع الشبيهة بالسجلات والمساواة القائمة على القيمة (نمط)

طبّق مساواة قائمة على القيمة شبيهة بالسجلات: أعد تعريف Equals/GetHashCode، وطبّق IEquatable ، وأضف معاملي ==/!=، وحافظ على عدم قابلية الأنواع للتغيير.

الدرس 2 من 38 خطوة

الأنواع الشبيهة بالسجلات والمساواة القائمة على القيمة (نمط) درس مجاني في C# Academy على CoddyKit. هذا هو الدرس 2 من أصل 3. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في C# Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة C# Academy 3 دروس في المجموع.

نظرة عامة على الأنواع الشبيهة بالسجلات

الهدف: جعل الكائنات تُقارن حسب القيمة (بأسلوب شبيه بالسجلات) في C# 6.

  • بيانات غير قابلة للتغيير
  • إعادة تعريف Equals وGetHashCode
  • تنفيذ IEquatable<T>
  • اختياري: تعريف ==/!=

مشكلة مساواة المراجع

تُقارن الفئات حسب المرجع افتراضيًا. ولا يكون كائنان لهما البيانات نفسها متساويين.

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)
  }
}

نمط الفئة الشبيهة بالسجلات

اجعل الفئة غير قابلة للتغيير ونفّذ 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
  }
}

نمط مساواة الهياكل

تُقارن الهياكل حسب الحقول باستخدام ValueType.Equals افتراضيًا، لكن تنفيذ 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.
  • نفّذ IEquatable<T> لإجراء مقارنات سريعة وآمنة من ناحية النوع.
  • أضف ==/!= لتسهيل الاستخدام.
  • استخدم الحقول نفسها باتساق في المساواة والتجزئة.

متطلبات المساواة للأنواع الشبيهة بالسجلات

تحقق سريع: لكي تتصرف فئة كقيمة (بأسلوب شبيه بالسجلات) في C# 6، ماذا يجب أن تفعل؟

مراجعة

مراجعة: في C# 6، تنشئ الأنواع الشبيهة بالسجلات يدويًا: بيانات غير قابلة للتغيير، وIEquatable<T>، وEquals/GetHashCode صحيحان، و==/!= اختياريان. استخدمها بأمان في المجموعات والقواميس.

البدء مجانًا

تعلم C# مع معلم ذكاء اصطناعي — مجانًا

اكتب وقم بتشغيل أكوادك الفعلية في المتصفح، واحصل على مساعدة فورية من معلم ذكاء اصطناعي متاح 24/7، واستمر من حيث توقفت على الويب أو في التطبيق.

الدورات
93
الدروس
346

الأسئلة الشائعة

هل درس «الأنواع الشبيهة بالسجلات والمساواة القائمة على القيمة (نمط)» مجاني؟

نعم — نص درس «الأنواع الشبيهة بالسجلات والمساواة القائمة على القيمة (نمط)» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة C# Academy، انتقل إلى CoddyKit PRO. تتضمن دورة C# Academy 3 دروس في المجموع.

ماذا ستتعلم في «الأنواع الشبيهة بالسجلات والمساواة القائمة على القيمة (نمط)»؟

طبّق مساواة قائمة على القيمة شبيهة بالسجلات: أعد تعريف Equals/GetHashCode، وطبّق IEquatable ، وأضف معاملي ==/!=، وحافظ على عدم قابلية الأنواع للتغيير. تتمرن على C# Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ C# Academy؟

لا تُشترط خبرة سابقة. C# Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 3.

كم من الوقت يستغرق درس «الأنواع الشبيهة بالسجلات والمساواة القائمة على القيمة (نمط)»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس C# Academy هذا؟

نعم. كل درس في C# Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. الهياكل: دلالات القيمة ونمط عدم القابلية للتغيير
  2. الأنواع الشبيهة بالسجلات والمساواة القائمة على القيمة (نمط)
  3. التعدادات و[Flags]
← العودة إلى C# Academy