Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

الحقول والدوال الساكنة (Static)

جزء من قسم Object Oriented Programming في رحلة C# على Coddy — الدرس 12 من 70.

حتى الآن، كل حقل وطريقة قمنا بإنشائها تنتمي إلى كائنات فردية. ولكن في بعض الأحيان تحتاج إلى بيانات أو سلوك ينتمي إلى الفئة نفسها، ويكون مشتركاً بين جميع النسخ. هنا يأتي دور الكلمة المفتاحية static.

يتم مشاركة الحقل الثابت (static field) بواسطة جميع كائنات الفئة. توجد نسخة واحدة فقط، بغض النظر عن عدد المثيلات التي تقوم بإنشائها:

public class Player
{
    public static int TotalPlayers = 0;
    public string Name { get; set; }
    
    public Player(string name)
    {
        Name = name;
        TotalPlayers++;
    }
}

في كل مرة يتم فيها إنشاء Player جديد، يزداد TotalPlayers. يتشارك جميع اللاعبين في هذا العداد نفسه.

تنتمي الـ static method إلى الفئة (class) ويمكن استدعاؤها دون إنشاء كائن:

public class Calculator
{
    public static int Add(int a, int b)
    {
        return a + b;
    }
}

// يتم استدعاؤه على الفئة، وليس على مثيل
int result = Calculator.Add(5, 3);

لاحظ أنك تقوم بالوصول إلى الأعضاء الثابتة (static members) باستخدام اسم الفئة، وليس مرجع كائن. لا يمكن للدوال الثابتة (Static methods) الوصول إلى حقول المثيل (instance fields) أو استخدام this، لأنها لا تنتمي إلى أي كائن محدد.

لقد استخدمت بالفعل الأعضاء الساكنة (static members) دون أن تدرك ذلك. Console.WriteLine() هي دالة ساكنة، و Math.PI هو حقل ساكن.

challenge icon

التحدي

سهل

لنقم ببناء نظام لتتبع الطلبات يستخدم الأعضاء الثابتة (static members) لتتبع جميع الطلبات التي يتم إجراؤها عبر تطبيقك.

ستقوم بإنشاء ملفين لتنظيم الكود الخاص بك:

  • Order.cs: قم بتعريف فئة Order داخل مساحة الأسماء OrderSystem. يجب أن يكون لكل طلب خاصية مثيل (instance property) باسم OrderId (من نوع int) و CustomerName (من نوع string). يجب أن تتبع الفئة أيضاً العدد الإجمالي للطلبات التي تم إنشاؤها باستخدام حقل ثابت TotalOrders، وتوفر طريقة ثابتة GetNextOrderId() تُرجع معرف الطلب التالي المتاح (بدءاً من 1). يجب أن يقبل المنشئ (constructor) اسم العميل، ويقوم تلقائياً بتعيين معرف الطلب باستخدام الطريقة الثابتة، ويزيد إجمالي عدد الطلبات.
  • Program.cs: في ملفك الرئيسي، قم بإنشاء طلبات بناءً على المدخلات واعرض تفاصيلها جنباً إلى جنب مع إجمالي عدد الطلبات.

ستتلقى مدخلين يمثلان أسماء العملاء لطلبين منفصلين.

لكل طلب، قم بطباعة تفاصيله بهذا التنسيق:

Order #{OrderId} - Customer: {CustomerName}

بعد إنشاء كلا الطلبين، قم بطباعة العدد الإجمالي:

Total Orders: {TotalOrders}

على سبيل المثال، إذا كانت المدخلات هي Alice و Bob، يجب أن يكون الناتج:

Order #1 - Customer: Alice
Order #2 - Customer: Bob
Total Orders: 2

ورقة مرجعية

تُنشئ الكلمة المفتاحية static أعضاءً ينتمون إلى الفئة (class) نفسها بدلاً من الانتماء إلى مثيلات (instances) فردية.

تتم مشاركة الحقول الثابتة (Static fields) عبر جميع كائنات الفئة. توجد نسخة واحدة فقط بغض النظر عن عدد المثيلات التي تم إنشاؤها:

public class Player
{
    public static int TotalPlayers = 0;
    public string Name { get; set; }
    
    public Player(string name)
    {
        Name = name;
        TotalPlayers++;
    }
}

تنتمي الأساليب الثابتة (Static methods) إلى الفئة ويمكن استدعاؤها دون إنشاء كائن:

public class Calculator
{
    public static int Add(int a, int b)
    {
        return a + b;
    }
}

// Called on the class, not an instance
int result = Calculator.Add(5, 3);

يتم الوصول إلى الأعضاء الثابتة باستخدام اسم الفئة، وليس مرجع الكائن. لا يمكن للأساليب الثابتة الوصول إلى حقول المثيلات أو استخدام this لأنها لا تنتمي إلى أي كائن محدد.

تشمل الأمثلة الشائعة للأعضاء الثابتة Console.WriteLine() (أسلوب ثابت) و Math.PI (حقل ثابت).

جرّب بنفسك

using System;
using OrderSystem;

class Program
{
    public static void Main(string[] args)
    {
        // قراءة أسماء العملاء
        string customer1 = Console.ReadLine();
        string customer2 = Console.ReadLine();

        // TODO: إنشاء كائنين من النوع Order بأسماء العملاء

        // TODO: طباعة تفاصيل كل طلب بالتنسيق التالي:
        // Order #{OrderId} - Customer: {CustomerName}

        // TODO: طباعة إجمالي عدد الطلبات بالتنسيق التالي:
        // Total Orders: {TotalOrders}
    }
}
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس Object Oriented Programming