خصائص القراءة فقط والكتابة فقط
جزء من قسم 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)، مما يجعلها غير قابلة للتغيير بعد إنشاء الكائن.
التحدي
سهللنقم ببناء نظام تكوين آمن يوضح متى يتم استخدام الخصائص للقراءة فقط (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}
}
}
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس Object Oriented Programming
1أساسيات OOP
الملفات الخارجيةNamespaces والتوجيهاتمقدمة في Classes و Objectsالكلمة المفتاحية 'this'Methods والمعاملاتFields مقابل PropertiesConstructorsObject Initializersمراجعة - آلة حاسبة بسيطة4الوراثة
صيغة الوراثة الأساسية (:)الكلمة المفتاحية 'base'الكلمات المفتاحية Virtual و Overrideالأصناف المختومة (Sealed Classes)الفئة الأساسية 'object'مراجعة - هيكلية الموظفين7ميزات متقدمة
تحميل العوامل (Operator Overloading)المفهرسات (Indexers (this[]))إعادة تعريف ()ToStringدوال التوسعة (Extension Methods)ملخص - Custom List2الخصائص والأعضاء الساكنة (Static Members)
الخصائص المطبقة تلقائيًا (Auto-Implemented Properties)خصائص القراءة فقط والكتابة فقطالحقول والدوال الساكنة (Static)الفئات الساكنة (Static Classes)الأعضاء ذات البنية التعبيرية (Expression-Bodied Members)5تعدد الأشكال والواجهات (Polymorphism & Interfaces)
تعدد الأشكال: وقت التجميع مقابل وقت التشغيلالواجهة مقابل الفئة المجردة (Abstract Class)الواجهات المتعددةالواجهات الصريحةUpcasting و Downcastingملخص - حاسبة الأشكال8مفاهيم البرمجة كائنية التوجه (OOP) المتقدمة
التركيب بدلاً من الوراثةالـ Generics (الأصناف والدوال)الـ Delegates والأحداثالـ Attributes والـ Reflectionواجهة IDisposable وجملة usingأساسيات Dependency Injection