البُناة الساكنة
هيّئوا الحالة الساكنة مرة واحدة بالضبط
البُناة الساكنة درس مجاني في C# Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في C# Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة C# Academy 4 دروس في المجموع.
ما هو المُنشئ الساكن؟
يُهيِّئ المُنشئ الساكن البيانات الساكنة لفئة ما. ويُنفَّذ تلقائيًا مرة واحدة قبل استخدام الفئة للمرة الأولى، ولا تستدعونه مباشرةً أبدًا.
using System;
class App
{
public static string Version;
static App()
{
Version = "1.0.0";
Console.WriteLine("Static constructor ran");
}
}
class Program
{
static void Main()
{
Console.WriteLine(App.Version);
}
}قواعد الصياغة
يستخدم المُنشئ الساكن الكلمة المفتاحية static، ويحمل اسم الفئة، ولا يأخذ أي معلمات، ولا يملك مُعدِّل وصول.
using System;
class Config
{
public static int MaxUsers;
static Config()
{
MaxUsers = 100;
}
}
class Program
{
static void Main()
{
Console.WriteLine("Max: " + Config.MaxUsers);
}
}يُنفَّذ مرة واحدة تمامًا
بغض النظر عن عدد مرات استخدامكم للفئة، لا يُنفَّذ المُنشئ الساكن إلا مرة واحدة، عند أول حاجة إليه.
using System;
class Counter
{
public static int Instances;
static Counter()
{
Console.WriteLine("Initializing static state");
Instances = 0;
}
public Counter() { Instances++; }
}
class Program
{
static void Main()
{
new Counter();
new Counter();
Console.WriteLine("Instances: " + Counter.Instances);
}
}متى يُفعَّل؟
يستدعيه وقت التشغيل مباشرةً قبل الوصول الأول إلى أي عضو ساكن OR إنشاء أول مثيل، أيهما يحدث أولًا.
using System;
class Lazy
{
public static string Data;
static Lazy()
{
Console.WriteLine("Triggered now");
Data = "ready";
}
}
class Program
{
static void Main()
{
Console.WriteLine("Before access");
Console.WriteLine(Lazy.Data);
}
}تهيئة البيانات الساكنة المعقدة
استخدموا مُنشئًا ساكنًا عندما تحتاج الحقول الساكنة إلى منطق فعلي لإعدادها، وليس إلى قيم حرفية بسيطة فحسب.
using System;
using System.Collections.Generic;
class Lookup
{
public static Dictionary<int, string> Table;
static Lookup()
{
Table = new Dictionary<int, string>();
for (int i = 1; i <= 3; i++)
Table[i] = "Item" + i;
}
}
class Program
{
static void Main()
{
Console.WriteLine(Lookup.Table[2]);
}
}المُنشئ الساكن مقابل مُهيِّئ الحقل
يمكن للقيم البسيطة استخدام مُهيِّئات مضمنة. أما المُنشئ الساكن فيُستخدم للإعداد الذي يحتاج إلى عبارات أو حلقات أو معالجة أخطاء.
using System;
class Settings
{
public static int Simple = 10; // inline initializer
public static int Computed; // needs logic
static Settings()
{
Computed = Simple * Simple;
}
}
class Program
{
static void Main()
{
Console.WriteLine(Settings.Simple + ", " + Settings.Computed);
}
}لا يُسمح بالمعلمات
بما أن وقت التشغيل يستدعيه نيابةً عنكم، فلا يمكن للمُنشئ الساكن قبول وسيطات. ويجب أن تكون جميع مدخلاته بيانات ساكنة أخرى أو ثوابت.
using System;
class Clock
{
public static int StartHour;
static Clock()
{
StartHour = 9;
}
}
class Program
{
static void Main()
{
Console.WriteLine("Start: " + Clock.StartHour);
}
}دمج المُنشئات الساكنة ومُنشئات المثيلات
يمكن للفئة أن تحتوي على النوعين معًا. يُنفَّذ المُنشئ الساكن مرة واحدة للنوع، بينما يُنفَّذ مُنشئ المثيل لكل كائن.
using System;
class Game
{
public static string Title;
public int Score;
static Game()
{
Title = "Coddy Quest";
}
public Game(int score)
{
Score = score;
}
}
class Program
{
static void Main()
{
var g = new Game(50);
Console.WriteLine(Game.Title + " score " + g.Score);
}
}ضمان الترتيب
يُضمن اكتمال المُنشئ الساكن قبل تنفيذ أي جسم لمُنشئ مثيل يؤدي إلى تشغيله، وبذلك تكون الحالة الساكنة جاهزة دائمًا.
using System;
class Service
{
public static string Endpoint;
static Service()
{
Endpoint = "https://api.example.com";
}
public Service()
{
Console.WriteLine("Using " + Endpoint);
}
}
class Program
{
static void Main()
{
new Service();
}
}استخدموه باعتدال
تضيف المُنشئات الساكنة فحصًا يُنفَّذ مرة واحدة قبل استخدام الفئة، وقد تضر بالأداء إذا أُفرط في استخدامها أو إذا طرحت استثناءً. احرصوا على أن تكون صغيرة وموثوقة.
using System;
class Cache
{
public static int[] Data;
static Cache()
{
Data = new int[] { 2, 4, 6, 8 };
}
}
class Program
{
static void Main()
{
Console.WriteLine(Cache.Data[3]);
}
}تجميع المفاهيم
تُعد المُنشئات الساكنة مثالية للإعداد لمرة واحدة للبيانات المشتركة للقراءة فقط، مثل جداول البحث أو الإعدادات المحمّلة من الثوابت.
using System;
using System.Collections.Generic;
class Currency
{
public static Dictionary<string, string> Symbols;
static Currency()
{
Symbols = new Dictionary<string, string>
{
["USD"] = "$",
["EUR"] = "E",
["JPY"] = "Y"
};
}
}
class Program
{
static void Main()
{
Console.WriteLine("USD symbol: " + Currency.Symbols["USD"]);
}
}تحقق سريع
اختبروا مدى فهمكم للمُنشئات الساكنة.
مراجعة
يستخدم المُنشئ الساكن الصيغة static ClassName() من دون معلمات أو مُعدِّل وصول. ويُنفَّذ مرة واحدة تلقائيًا قبل استخدام الفئة للمرة الأولى، لتهيئة الحالة الساكنة التي تحتاج إلى منطق فعلي. استخدموه باعتدال للإعداد لمرة واحدة للبيانات المشتركة.
using System;
class Demo
{
public static int Value;
static Demo() { Value = 42; }
}
class Program
{
static void Main()
{
Console.WriteLine(Demo.Value);
}
}الأسئلة الشائعة
هل درس «البُناة الساكنة» مجاني؟
نعم — نص درس «البُناة الساكنة» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة C# Academy، انتقل إلى CoddyKit PRO. تتضمن دورة C# Academy 4 دروس في المجموع.
ماذا ستتعلم في «البُناة الساكنة»؟
هيّئوا الحالة الساكنة مرة واحدة بالضبط تتمرن على C# Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ C# Academy؟
لا تُشترط خبرة سابقة. C# Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.
كم من الوقت يستغرق درس «البُناة الساكنة»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس C# Academy هذا؟
نعم. كل درس في C# Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.