تعبيرات with في Records
أنشئوا نسخًا معدّلة من الكائنات غير القابلة للتغيير
تعبيرات with في Records درس مجاني في C# Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في C# Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة C# Academy 4 دروس في المجموع.
تعبير with
ينشئ تعبير with نسخة من سجل مع تغيير بعض خصائصه، ويترك الأصل دون تغيير. وهذه هي الطريقة الاصطلاحية لـ «تحديث» السجلات غير القابلة للتغيير.
using System;
record Point(int X, int Y);
var a = new Point(1, 2);
var b = a with { Y = 9 };
Console.WriteLine(a + " | " + b); // Point { X = 1, Y = 2 } | Point { X = 1, Y = 9 }التغيير غير التدميري
لا يُعدَّل السجل الأصلي أبدًا. ينفّذ with نسخًا سطحيًا ويطبّق التغييرات المُدرجة على النسخة فقط.
using System;
record User(string Name, int Age);
var original = new User("Ada", 30);
var older = original with { Age = 31 };
Console.WriteLine(original.Age + " " + older.Age); // 30 31تغيير خصائص متعددة
أدرجوا عدة عمليات إسناد داخل الأقواس المعقوفة لتغيير أكثر من خاصية واحدة في الوقت نفسه.
using System;
record Config(string Env, int Retries, bool Verbose);
var baseCfg = new Config("dev", 3, false);
var prod = baseCfg with { Env = "prod", Verbose = true };
Console.WriteLine(prod.Env + " " + prod.Retries + " " + prod.Verbose); // prod 3 Trueنسخ الخصائص التي لم تتغير
تُنسخ الخصائص التي لا تذكرونها كما هي من السجل المصدر.
using System;
record Product(string Name, decimal Price, int Stock);
var p = new Product("Book", 12m, 5);
var discounted = p with { Price = 10m };
Console.WriteLine(discounted.Name + " " + discounted.Stock); // Book 5with وتساوي القيم
بما أن السجلات تستخدم المساواة حسب القيمة، فإن النسخة التي لا تغيّر شيئًا تساوي السجل الأصلي.
using System;
record Coord(int X, int Y);
var a = new Coord(1, 2);
var b = a with { };
Console.WriteLine(a == b); // True (value equal)
Console.WriteLine(ReferenceEquals(a, b)); // False (different objects)دلالات النسخ السطحي
ينسخ with المراجع، وليس الرسوم البيانية العميقة للكائنات. لذلك يشترك الكائن القابل للتغيير المتداخل بين السجل الأصلي والنسخة.
using System;
using System.Collections.Generic;
record Cart(List<string> Items);
var a = new Cart(new List<string> { "x" });
var b = a with { };
b.Items.Add("y"); // shared list!
Console.WriteLine(a.Items.Count); // 2with مع هياكل record
تدعم هياكل record أيضًا with، فتنتج نسخة معدّلة من نوع القيمة.
using System;
record struct Size(int W, int H);
var s = new Size(4, 4);
var wide = s with { W = 8 };
Console.WriteLine(wide.W + "x" + wide.H); // 8x4تسلسل تعبيرات with
يمكنكم تسلسل تعبيرات with لتطبيق سلسلة من التغييرات، بحيث ينتج عن كل تعبير سجل جديد.
using System;
record Point(int X, int Y, int Z);
var p = new Point(0, 0, 0)
with { X = 1 }
with { Y = 2 }
with { Z = 3 };
Console.WriteLine(p); // Point { X = 1, Y = 2, Z = 3 }تحديثات من دون Builder
يلغي with الحاجة إلى أصناف Builder؛ فما عليكم سوى نسخ الحقول التي تريدونها وتعديلها.
using System;
record Email(string To, string Subject, string Body);
var draft = new Email("a@b.com", "Hi", "");
var ready = draft with { Body = "Welcome!" };
Console.WriteLine(ready.Body); // Welcome!منطق النسخ المخصص
تُنشئ السجلات مُنشئ نسخ محميًا يستخدمه with. ويمكنكم تعريف مُنشئكم الخاص لتخصيص طريقة إنشاء النسخ.
using System;
record Audited(string Name) {
public int Version { get; init; } = 1;
protected Audited(Audited other) {
Name = other.Name;
Version = other.Version + 1; // bump on every copy
}
}
var a = new Audited("x");
var b = a with { };
Console.WriteLine(a.Version + " " + b.Version); // 1 2تجميع المفاهيم
يساعدكم تصميم انتقالات الحالة باستخدام with في الحفاظ على سجل تاريخي غير قابل للتغيير وسهل التدقيق.
using System;
record Order(string Id, string Status);
var created = new Order("O1", "Created");
var paid = created with { Status = "Paid" };
var shipped = paid with { Status = "Shipped" };
Console.WriteLine(created.Status + " -> " + paid.Status + " -> " + shipped.Status);اختبار سريع
اختبروا مدى فهمكم لتعبيرات with.
مراجعة
تعلّمتم تعبيرات with الخاصة بالسجلات.
- ينسخ
a with { Prop = value }الخصائص المحددة ويغيّرها. - لا يُعدَّل السجل الأصلي مطلقًا؛ فهذا النسخ غير هدّام.
- النسخ سطحي، ولذلك تشترك الكائنات القابلة للتغيير المتداخلة.
- يعمل ذلك مع السجلات وهياكل record، ويمكن تسلسل التعبيرات.
تعلم C# مع معلم ذكاء اصطناعي — مجانًا
اكتب وقم بتشغيل أكوادك الفعلية في المتصفح، واحصل على مساعدة فورية من معلم ذكاء اصطناعي متاح 24/7، واستمر من حيث توقفت على الويب أو في التطبيق.
- الدورات
- 93
- الدروس
- 346
الأسئلة الشائعة
هل درس «تعبيرات with في Records» مجاني؟
نعم — نص درس «تعبيرات with في Records» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة C# Academy، انتقل إلى CoddyKit PRO. تتضمن دورة C# Academy 4 دروس في المجموع.
ماذا ستتعلم في «تعبيرات with في Records»؟
أنشئوا نسخًا معدّلة من الكائنات غير القابلة للتغيير تتمرن على C# Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ C# Academy؟
لا تُشترط خبرة سابقة. C# Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.
كم من الوقت يستغرق درس «تعبيرات with في Records»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس C# Academy هذا؟
نعم. كل درس في C# Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- عوامل الضبط التي لا تعمل إلا مع init
- المُعدِّل required
- أنماط الكائنات غير القابلة للتغيير
- تعبيرات with في Records