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

خصائص القراءة فقط والكتابة فقط

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

أحياناً تحتاج إلى خصائص يمكن قراءتها فقط أو كتابتها فقط. يمكنك التحكم في ذلك باستخدام private على أدوات الوصول (accessors) الفردية.

تمتلك الخاصية للقراءة فقط getter عاماً ولكن setter خاصاً (أو لا تمتلك setter على الإطلاق):

public class User
{
    public string Username { get; private set; }
    
    public User(string username)
    {
        Username = username;
    }
}

يمكن للكود الخارجي قراءة Username، ولكن يمكن للفئة نفسها فقط تعديله. هذا مفيد للقيم التي يجب تعيينها مرة واحدة أثناء عملية الإنشاء.

تملك الخاصية المخصصة للكتابة فقط مُعيّن (setter) عام ولكن جالب (getter) خاص:

public class Account
{
    public string Password { private get; set; }
    
    public bool ValidatePassword(string input)
    {
        return input == Password;
    }
}

تعد خصائص الكتابة فقط (Write-only properties) نادرة ولكنها مفيدة للبيانات الحساسة مثل كلمات المرور، حيث تريد قبول المدخلات دون كشف القيمة المخزنة.

يمكنك أيضاً إنشاء خصائص للقراءة فقط بشكل حقيقي باستخدام دالة جلب (getter) فقط:

public class Circle
{
    public double Radius { get; }
    public double Area => Math.PI * Radius * Radius;
    
    public Circle(double radius)
    {
        Radius = radius;
    }
}

الخصائص التي تحتوي فقط على get; يمكن تعيين قيمتها فقط في المنشئ (constructor) أو عند التصريح (declaration)، مما يجعلها غير قابلة للتغيير بعد إنشاء الكائن.

challenge icon

التحدي

سهل

لنقم ببناء نظام تكوين آمن يوضح متى يتم استخدام الخصائص للقراءة فقط (read-only) وللكتابة فقط (write-only) لحماية البيانات الحساسة.

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

  • Config.cs: قم بتعريف فئة ServerConfig داخل مساحة الأسماء Settings التي تدير تكوين الخادم. يجب أن تحتوي على:
    • خاصية للقراءة فقط ServerName (يمكن تعيينها فقط في المشيد)
    • خاصية للقراءة فقط Port مع معدل تعيين خاص (private setter) (يتم تعيينها عبر المشيد)
    • خاصية للكتابة فقط ApiKey تقوم بتخزين مفتاح سري داخلياً
    • دالة ValidateApiKey(string key) تعيد true إذا كان المفتاح المقدم يطابق المفتاح المخزن
    • مشيد (constructor) يقبل اسم الخادم والمنفذ (port)
  • Program.cs: في ملفك الرئيسي، قم بإنشاء كائن ServerConfig باستخدام قيم الإدخال، وقم بتعيين مفتاح API، ثم تحقق من صحته مقابل مفتاح اختبار.

ستتلقى أربعة مدخلات:

  • اسم الخادم (Server name)
  • رقم المنفذ (Port number)
  • مفتاح API للتخزين
  • مفتاح API للتحقق

اطبع تفاصيل الخادم ونتيجة التحقق بهذا التنسيق:

Server: {ServerName}, Port: {Port}
API Key Valid: {True/False}

على سبيل المثال، إذا كانت المدخلات هي MainServer، و 8080، و secret123، و secret123، يجب أن يكون المخرج:

Server: MainServer, Port: 8080
API Key Valid: True

ورقة مرجعية

يمكنك التحكم في الوصول إلى الخاصية باستخدام private على الموصلات (accessors) الفردية.

خاصية للقراءة فقط مع مُعيّن (setter) خاص:

public class User
{
    public string Username { get; private set; }
    
    public User(string username)
    {
        Username = username;
    }
}

يمكن للكود الخارجي قراءة Username، ولكن يمكن للفئة نفسها فقط تعديله.

خاصية للكتابة فقط مع جالب (getter) خاص:

public class Account
{
    public string Password { private get; set; }
    
    public bool ValidatePassword(string input)
    {
        return input == Password;
    }
}

مفيد للبيانات الحساسة حيث تريد قبول الإدخال دون الكشف عن القيمة المخزنة.

خاصية للقراءة فقط حقاً مع جالب (getter) فقط:

public class Circle
{
    public double Radius { get; }
    
    public Circle(double radius)
    {
        Radius = radius;
    }
}

الخصائص التي تحتوي على get; فقط يمكن تعيينها فقط في المنشئ (constructor) أو عند التصريح، مما يجعلها غير قابلة للتغيير بعد إنشاء الكائن.

جرّب بنفسك

using System;
using Settings;

class Program
{
    public static void Main(string[] args)
    {
        // قراءة المدخلات
        string serverName = Console.ReadLine();
        int port = Convert.ToInt32(Console.ReadLine());
        string apiKeyToStore = Console.ReadLine();
        string apiKeyToValidate = Console.ReadLine();

        // TODO: مع serverName و port الخاص بـ ServerConfig قم بإنشاء كائن

        // TODO: باستخدام خاصية الكتابة فقط API قم بتعيين مفتاح

        // TODO: واطبع النتائج API قم بالتحقق من مفتاح
        // Format: Server: {ServerName}, Port: {Port}
        //         API Key Valid: {True/False}
    }
}
quiz iconاختبر نفسك

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

جميع دروس Object Oriented Programming