أنماط الكائنات غير القابلة للتغيير
صمّموا كائنات لا تتغير بعد إنشائها
أنماط الكائنات غير القابلة للتغيير درس مجاني في C# Academy على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في C# Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة C# Academy 4 دروس في المجموع.
تصميم كائنات غير قابلة للتغيير
الكائن غير القابل للتغيير لا يتغير بعد إنشائه. وتزيل عدم قابلية التغيير فئات كاملة من الأخطاء المتعلقة بالحالة المشتركة القابلة للتغيير، وتجعل تمرير الكائنات وتخزينها مؤقتًا آمنًا.
الخصائص للقراءة فقط
أبسط خاصية غير قابلة للتغيير هي الخاصية للقراءة فقط، التي تُسنَد مرة واحدة من مُنشئ.
using System;
class Point {
public int X { get; }
public int Y { get; }
public Point(int x, int y) { X = x; Y = y; }
}
var p = new Point(3, 4);
Console.WriteLine(p.X + "," + p.Y); // 3,4init لصياغة المُهيِّئات
استخدموا خصائص init عندما تريدون عدم قابلية التغيير مع سهولة صياغة مُهيِّئ الكائن.
using System;
class Color {
public int R { get; init; }
public int G { get; init; }
public int B { get; init; }
}
var c = new Color { R = 255, G = 128, B = 0 };
Console.WriteLine(c.R + "," + c.G + "," + c.B); // 255,128,0required للحقول الإلزامية
اجمعوا بين required + init حتى لا يمكن نسيان الحقول الأساسية أو تغييرها.
using System;
class Money {
public required decimal Amount { get; init; }
public required string Currency { get; init; }
}
var m = new Money { Amount = 9.99m, Currency = "USD" };
Console.WriteLine(m.Amount + " " + m.Currency); // 9.99 USDإرجاع كائنات جديدة بدلًا من التغيير
تعرض الأنواع غير القابلة للتغيير عمليات «التغيير» كأساليب تُرجع مثيلًا جديدًا، وتترك المثيل الأصلي دون تغيير.
using System;
class Point {
public int X { get; init; }
public int Y { get; init; }
public Point Move(int dx, int dy) => new Point { X = X + dx, Y = Y + dy };
}
var a = new Point { X = 1, Y = 1 };
var b = a.Move(2, 3);
Console.WriteLine(a.X + "," + a.Y + " -> " + b.X + "," + b.Y); // 1,1 -> 3,4المجموعات غير القابلة للتغيير
بالنسبة إلى حقول المجموعات، خزّنوا مجموعة غير قابلة للتغيير أو للقراءة فقط، حتى لا يمكن تغيير المحتويات عبر الكائن.
using System;
using System.Collections.Immutable;
class Team {
public ImmutableList<string> Members { get; init; } = ImmutableList<string>.Empty;
}
var t = new Team { Members = ["Ada", "Lin"] };
var t2 = new Team { Members = t.Members.Add("Sam") };
Console.WriteLine(t.Members.Count + " " + t2.Members.Count); // 2 3النسخ الوقائي
إذا اضطررتم إلى قبول مجموعة قابلة للتغيير، فانسخوها عند الإدخال حتى لا تتسرب التغييرات الخارجية.
using System;
using System.Collections.Generic;
using System.Linq;
class Snapshot {
private readonly int[] data;
public Snapshot(IEnumerable<int> source) => data = source.ToArray();
public IReadOnlyList<int> Data => data;
}
var list = new List<int> { 1, 2, 3 };
var snap = new Snapshot(list);
list.Add(4); // does not affect snap
Console.WriteLine(snap.Data.Count); // 3المساواة حسب القيمة
غالبًا ما تحتاج الكائنات غير القابلة للتغيير إلى مساواة مبنية على القيمة: إذ تُعد مثيلتان بالبيانات نفسها متساويتين. توفر السجلات ذلك تلقائيًا، بينما تحتاج الفئات إلى تجاوزات.
using System;
record Coord(int X, int Y);
Console.WriteLine(new Coord(1, 2) == new Coord(1, 2)); // Trueأمان الخيوط تلقائيًا
لأن الكائنات غير القابلة للتغيير لا تتغير أبدًا، فهي آمنة بطبيعتها للمشاركة بين الخيوط دون أقفال.
using System;
class ReadonlyConfig {
public required string Env { get; init; }
}
var cfg = new ReadonlyConfig { Env = "prod" };
// safe to read from many threads without synchronization
Console.WriteLine(cfg.Env); // prodالحقول والبنى للقراءة فقط
استخدموا حقول readonly وreadonly struct لفرض عدم قابلية التغيير على أنواع القيم على مستوى الحقل.
using System;
readonly struct Vector {
public readonly double X, Y;
public Vector(double x, double y) { X = x; Y = y; }
public double Length => Math.Sqrt(X * X + Y * Y);
}
Console.WriteLine(new Vector(3, 4).Length); // 5تجميع المفاهيم
نوع غير قابل للتغيير بالكامل، يجمع بين required وinit والمساواة حسب القيمة وأسلوب تحديث لا يغيّر الكائن.
using System;
record Account(string Id, decimal Balance) {
public Account Deposit(decimal amount) => this with { Balance = Balance + amount };
}
var a = new Account("A1", 100m);
var b = a.Deposit(50m);
Console.WriteLine(a.Balance + " -> " + b.Balance); // 100 -> 150تحقق سريع
تحققوا من مبدأ التحديث غير القابل للتغيير.
مراجعة
تعلّمتم أنماطًا لإنشاء كائنات غير قابلة للتغيير.
- استخدموا الخصائص للقراءة فقط أو خصائص
init، إلى جانبrequiredللبيانات الإلزامية. - مثّلوا التغييرات كأساليب تُرجع مثيلات جديدة.
- خزّنوا مجموعات غير قابلة للتغيير أو منسوخة وقائيًا.
- توفر السجلات المساواة حسب القيمة ونسخ
with؛ وتوفر عدم قابلية التغيير أمان الخيوط.
تعلم C# مع معلم ذكاء اصطناعي — مجانًا
اكتب وقم بتشغيل أكوادك الفعلية في المتصفح، واحصل على مساعدة فورية من معلم ذكاء اصطناعي متاح 24/7، واستمر من حيث توقفت على الويب أو في التطبيق.
- الدورات
- 93
- الدروس
- 346
الأسئلة الشائعة
هل درس «أنماط الكائنات غير القابلة للتغيير» مجاني؟
نعم — نص درس «أنماط الكائنات غير القابلة للتغيير» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة C# Academy، انتقل إلى CoddyKit PRO. تتضمن دورة C# Academy 4 دروس في المجموع.
ماذا ستتعلم في «أنماط الكائنات غير القابلة للتغيير»؟
صمّموا كائنات لا تتغير بعد إنشائها تتمرن على C# Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ C# Academy؟
لا تُشترط خبرة سابقة. C# Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.
كم من الوقت يستغرق درس «أنماط الكائنات غير القابلة للتغيير»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس C# Academy هذا؟
نعم. كل درس في C# Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- عوامل الضبط التي لا تعمل إلا مع init
- المُعدِّل required
- أنماط الكائنات غير القابلة للتغيير
- تعبيرات with في Records