تكرار السؤال: …
الإجابة المختصرة
الـ Records مصممة لكائنات القيمة غير القابلة للتعديل (Immutability) وتوفر مقارنة تلقائية استناداً للقيم (Value-based equality) مع دعم تعبير with للنسخ غير التدميري.
الشرح
تعتمد الـ Classes العادية على المقارنة المرجعية (Reference Equality)؛ حيث يختلف كائنان حتى لو تطابقت كل خصائصهما. في المقابل، تقوم الـ Records بمقارنة القيم تلقائياً وتولد دوال Equals و GetHashCode ومطبوعات ToString منسقة. كما تتيح الـ Positional Records تعريفا موجزاً بسطر واحد public record UserDto(int Id, string Name); مع خصائص init-only افتراضياً.
مثال بالكود
public record Point(int X, int Y);
var p1 = new Point(1, 2);
var p2 = new Point(1, 2);
Console.WriteLine(p1 == p2); // True (مقارنة بالقيم)
var p3 = p1 with { Y = 5 }; // نسخ غير تدميريأخطاء شائعة
- استخدام Classes عادية لتمثيل DTOs وكائنات القيمة في DDD مع الاضطرار لكتابة دالات Equals و GetHashCode يدوياً.