0Pricing
C# Academy · درس

الخصائص الكاملة مع الحقول الداعمة

أضيفوا منطقًا إلى getter وsetter

الخصائص الكاملة مع الحقول الداعمة درس مجاني في C# Academy على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في C# Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة C# Academy 4 دروس في المجموع.

ما بعد الخصائص التلقائية

عندما تحتاج إلى وضع منطق داخل get أو set، تكتب خاصية كاملة مع حقل إسناد صريح. يخزّن الحقل البيانات، بينما تتحكم دوال الوصول في الوصول إليها.

using System;

class Temperature
{
    private double _celsius;

    public double Celsius
    {
        get { return _celsius; }
        set { _celsius = value; }
    }
}

class Program
{
    static void Main()
    {
        var t = new Temperature();
        t.Celsius = 21.5;
        Console.WriteLine(t.Celsius);
    }
}

اصطلاح تسمية حقل الإسناد

يكون حقل الإسناد، وفقًا للاصطلاح، private ويُسمّى بشرطة سفلية في بدايته، مثل _name. وتعرض الخاصية العامة هذا الحقل.

using System;

class Person
{
    private string _name;

    public string Name
    {
        get { return _name; }
        set { _name = value; }
    }
}

class Program
{
    static void Main()
    {
        var p = new Person();
        p.Name = "Grace";
        Console.WriteLine(p.Name);
    }
}

الكلمة الأساسية value

داخل دالة وصول set، تحتوي المعلمة الضمنية value على القيمة الواردة من عملية الإسناد. وأنت تحدد ما الذي ستفعله بها.

using System;

class Box
{
    private int _size;

    public int Size
    {
        get { return _size; }
        set { _size = value * 2; }
    }
}

class Program
{
    static void Main()
    {
        var box = new Box();
        box.Size = 10;
        Console.WriteLine("Stored size: " + box.Size);
    }
}

التحقق من الصحة في دالة الإسناد

من الاستخدامات الشائعة للخاصية الكاملة التحقق من الإدخال قبل تخزينه، مع إلقاء استثناء إذا كانت القيمة غير صالحة.

using System;

class Account
{
    private decimal _balance;

    public decimal Balance
    {
        get { return _balance; }
        set
        {
            if (value < 0)
                throw new ArgumentException("Balance cannot be negative");
            _balance = value;
        }
    }
}

class Program
{
    static void Main()
    {
        var a = new Account();
        a.Balance = 500m;
        Console.WriteLine("Balance: " + a.Balance);
    }
}

الخصائص المحسوبة للقراءة فقط

يمكن لخاصية تحتوي على get فقط أن تحسب قيمتها من حقول أخرى. ولا يوجد حقل إسناد لأن أي بيانات لا تُخزَّن.

using System;

class Rectangle
{
    private double _width;
    private double _height;

    public Rectangle(double w, double h)
    {
        _width = w;
        _height = h;
    }

    public double Area
    {
        get { return _width * _height; }
    }
}

class Program
{
    static void Main()
    {
        var r = new Rectangle(4, 5);
        Console.WriteLine("Area: " + r.Area);
    }
}

الآثار الجانبية في دوال الإسناد

يمكن لدالة الإسناد أن تفعل أكثر من التخزين؛ إذ يمكنها توحيد تنسيق الإدخال، أو تحديث الحالة المرتبطة، أو تسجيل التغييرات.

using System;

class User
{
    private string _email;

    public string Email
    {
        get { return _email; }
        set { _email = value.Trim().ToLower(); }
    }
}

class Program
{
    static void Main()
    {
        var u = new User();
        u.Email = "  Hello@Example.COM  ";
        Console.WriteLine("Normalized: " + u.Email);
    }
}

الحساب الكسول في دالة الوصول

يمكن لدالة الوصول تخزين نتيجة مكلفة الحساب في حقل إسناد عند طلبها للمرة الأولى.

using System;

class Report
{
    private string _cached;

    public string Content
    {
        get
        {
            if (_cached == null)
                _cached = "Generated at runtime";
            return _cached;
        }
    }
}

class Program
{
    static void Main()
    {
        var r = new Report();
        Console.WriteLine(r.Content);
        Console.WriteLine(r.Content);
    }
}

الحماية من الحالة غير الصالحة

ادمج حقل إسناد مع منطق برمجي للحفاظ على الكائن في حالة صالحة دائمًا. في هذا المثال، تحصر دالة الإسناد القيمة ضمن نطاق محدد.

using System;

class Volume
{
    private int _level;

    public int Level
    {
        get { return _level; }
        set
        {
            if (value < 0) _level = 0;
            else if (value > 100) _level = 100;
            else _level = value;
        }
    }
}

class Program
{
    static void Main()
    {
        var v = new Volume();
        v.Level = 150;
        Console.WriteLine("Clamped: " + v.Level);
    }
}

دمج القيم المخزنة والمحسوبة

غالبًا ما تدمج الفئة بين الخصائص المخزنة، ذات حقول الإسناد، والخصائص المحسوبة للقراءة فقط والمشتقة منها.

using System;

class Employee
{
    private string _first;
    private string _last;

    public string First { get { return _first; } set { _first = value; } }
    public string Last { get { return _last; } set { _last = value; } }
    public string FullName { get { return _first + " " + _last; } }
}

class Program
{
    static void Main()
    {
        var e = new Employee { First = "Marie", Last = "Curie" };
        Console.WriteLine(e.FullName);
    }
}

إطلاق إشعارات التغيير

تُعدّ دوال الإسناد المكان الطبيعي لإرسال إشعار عند تغيّر البيانات، وهو نمط يُستخدم بكثرة في أطر عمل واجهات المستخدم.

using System;

class Model
{
    private int _count;

    public int Count
    {
        get { return _count; }
        set
        {
            if (_count != value)
            {
                _count = value;
                Console.WriteLine("Count changed to " + _count);
            }
        }
    }
}

class Program
{
    static void Main()
    {
        var m = new Model();
        m.Count = 1;
        m.Count = 1;
        m.Count = 2;
    }
}

جمع العناصر معًا

تتيح الخصائص الكاملة للفئة فرض الثوابت وكشف البيانات المشتقة، وكل ذلك من خلال واجهة نظيفة تشبه الحقول.

using System;

class Thermostat
{
    private double _target;

    public double Target
    {
        get { return _target; }
        set { _target = value < 10 ? 10 : value; }
    }

    public string Status { get { return _target >= 22 ? "Warm" : "Cool"; } }
}

class Program
{
    static void Main()
    {
        var th = new Thermostat();
        th.Target = 5;
        Console.WriteLine(th.Target + " -> " + th.Status);
        th.Target = 24;
        Console.WriteLine(th.Target + " -> " + th.Status);
    }
}

تحقق سريع

اختبر فهمك للخصائص الكاملة.

مراجعة

تجمع الخاصية الكاملة بين حقل إسناد خاص ودوال وصول صريحة get/set، بحيث يمكنك إضافة التحقق من الصحة أو توحيد التنسيق أو التخزين المؤقت أو إشعارات التغيير. ولا تحتوي الخصائص المحسوبة للقراءة فقط إلا على دالة وصول، ولا تملك حقل إسناد. وتحمل الكلمة الأساسية value القيمة الواردة من عملية الإسناد داخل دالة الإسناد.

using System;

class Demo
{
    private int _n;
    public int N
    {
        get { return _n; }
        set { _n = value < 0 ? 0 : value; }
    }
    public int Doubled { get { return _n * 2; } }
}

class Program
{
    static void Main()
    {
        var d = new Demo();
        d.N = -5;
        Console.WriteLine(d.N + ", " + d.Doubled);
    }
}

الأسئلة الشائعة

هل درس «الخصائص الكاملة مع الحقول الداعمة» مجاني؟

نعم — نص درس «الخصائص الكاملة مع الحقول الداعمة» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة C# Academy، انتقل إلى CoddyKit PRO. تتضمن دورة C# Academy 4 دروس في المجموع.

ماذا ستتعلم في «الخصائص الكاملة مع الحقول الداعمة»؟

أضيفوا منطقًا إلى getter وsetter تتمرن على C# Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ C# Academy؟

لا تُشترط خبرة سابقة. C# Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.

كم من الوقت يستغرق درس «الخصائص الكاملة مع الحقول الداعمة»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس C# Academy هذا؟

نعم. كل درس في C# Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. الخصائص المُطبَّقة تلقائيًا
  2. الخصائص الكاملة مع الحقول الداعمة
  3. الأعضاء ذات جسم التعبير
  4. المفهرسات
← العودة إلى C# Academy