الأعضاء ذات البنية التعبيرية (Expression-Bodied Members)
جزء من قسم Object Oriented Programming في رحلة C# على Coddy — الدرس 14 من 70.
توفر الأعضاء ذات الأجسام التعبيرية (Expression-bodied members) صيغة مختصرة للأعضاء التي تحتوي على تعبير واحد فقط. فبدلاً من كتابة أجسام الدوال أو الخصائص الكاملة باستخدام الأقواس، يمكنك استخدام صيغة السهم =>.
بالنسبة للدوال التي تُرجع تعبيراً واحداً، يمكنك استبدال الجسم بالكامل:
// الطريقة التقليدية
public int Add(int a, int b)
{
return a + b;
}
// دالة بجسم تعبيري
public int Add(int a, int b) => a + b;يعمل هذا النحو البرمجي مع الخصائص المخصصة للقراءة فقط أيضًا، والتي سبق لك رؤيتها باختصار:
public class Circle
{
public double Radius { get; set; }
public double Area => Math.PI * Radius * Radius;
public double Circumference => 2 * Math.PI * Radius;
}يمكنك أيضاً استخدام أجسام التعبيرات (expression bodies) لمُحضرات (getters) ومُعينات (setters) الخصائص بشكل فردي:
private string name;
public string Name
{
get => name;
set => name = value.Trim();
}حتى المنشئات (constructors) يمكنها استخدام هذا النحو عندما تحتوي على عبارة برمجية واحدة:
public class Person
{
public string Name { get; }
public Person(string name) => Name = name;
}تجعل الأعضاء المعتمدون على التعبير (Expression-bodied members) كودك أكثر قابلية للقراءة عندما يكون المنطق بسيطاً. استخدمها للعمليات المباشرة، ولكن التزم بالكتل البرمجية التقليدية عندما تحتاج إلى جمل برمجية متعددة أو منطق معقد.
التحدي
سهللنقم ببناء حاسبة تسعير للمنتجات تستعرض قوة الأعضاء المعتمدين على التعبير (expression-bodied members) لكتابة كود نظيف وموجز.
ستقوم بإنشاء ملفين لتنظيم الكود الخاص بك:
Product.cs: قم بتعريف فئةProductداخل مساحة الأسماءStore. يجب أن تستعرض هذه الفئة أعضاء مختلفين معتمدين على التعبير:- خاصية مطبقة تلقائياً (auto-implemented property) باسم
Name(string) وBasePrice(decimal) - منشئ (constructor) معتمد على التعبير يقوم بتعيين كلتا الخاصيتين
- خاصية للقراءة فقط معتمدة على التعبير باسم
TaxAmountتحسب 10% من السعر الأساسي - خاصية للقراءة فقط معتمدة على التعبير باسم
TotalPriceتعيد السعر الأساسي بالإضافة إلى مبلغ الضريبة - دالة (method) معتمدة على التعبير باسم
GetDiscount(decimal percentage)تعيد مبلغ الخصم (السعر الأساسي مضروباً في النسبة المئوية مقسوماً على 100) - دالة معتمدة على التعبير باسم
GetFinalPrice(decimal discountPercentage)تعيد السعر الإجمالي مطروحاً منه الخصم
- خاصية مطبقة تلقائياً (auto-implemented property) باسم
Program.cs: في ملفك الرئيسي، قم بإنشاء كائنProductباستخدام قيم الإدخال، ثم اعرض تفاصيل التسعير الخاصة به.
ستتلقى ثلاثة مدخلات:
- اسم المنتج
- السعر الأساسي
- نسبة الخصم المراد تطبيقها
اطبع تفاصيل التسعير بهذا التنسيق:
Product: {Name}
Base Price: {BasePrice}
Tax (10%): {TaxAmount}
Total Price: {TotalPrice}
Discount ({percentage}%): {discountAmount}
Final Price: {finalPrice}على سبيل المثال، إذا كانت المدخلات هي Laptop، و 1000، و 15، يجب أن يكون المخرج:
Product: Laptop
Base Price: 1000
Tax (10%): 100
Total Price: 1100
Discount (15%): 150
Final Price: 950تذكر استخدام صيغة السهم => لجميع الأعضاء الذين يحتوي كودهم على تعبير واحد فقط. هذا يجعل الكود الخاص بك نظيفاً وسهل القراءة!
ورقة مرجعية
تستخدم الأعضاء ذات البنية التعبيرية (Expression-bodied members) بناء جملة السهم => للأعضاء التي تحتوي على تعبير واحد، مما يوفر بديلاً موجزاً لأجسام الأساليب والخصائص التقليدية.
الأساليب ذات البنية التعبيرية (Expression-bodied methods):
// أسلوب تقليدي
public int Add(int a, int b)
{
return a + b;
}
// أسلوب ذو بنية تعبيرية
public int Add(int a, int b) => a + b;خصائص القراءة فقط ذات البنية التعبيرية:
public class Circle
{
public double Radius { get; set; }
public double Area => Math.PI * Radius * Radius;
public double Circumference => 2 * Math.PI * Radius;
}دوال الحصول والتعيين للخصائص ذات البنية التعبيرية:
private string name;
public string Name
{
get => name;
set => name = value.Trim();
}المنشئات ذات البنية التعبيرية:
public class Person
{
public string Name { get; }
public Person(string name) => Name = name;
}استخدم الأعضاء ذات البنية التعبيرية للعمليات المباشرة. بالنسبة للجمل المتعددة أو المنطق المعقد، استخدم الأجسام التقليدية.
جرّب بنفسك
using System;
using Store;
class Program
{
public static void Main(string[] args)
{
// قراءة المدخلات
string name = Console.ReadLine();
decimal basePrice = Convert.ToDecimal(Console.ReadLine());
decimal discountPercentage = Convert.ToDecimal(Console.ReadLine());
// TODO: إنشاء كائن Product باستخدام قيم المدخلات
// TODO: حساب قيمة الخصم باستخدام الطريقة GetDiscount
// TODO: حساب السعر النهائي باستخدام الطريقة GetFinalPrice
// TODO: طباعة تفاصيل التسعير بالتنسيق المطلوب:
// Product: {Name}
// Base Price: {BasePrice}
// Tax (10%): {TaxAmount}
// Total Price: {TotalPrice}
// Discount ({percentage}%): {discountAmount}
// Final Price: {finalPrice}
}
}
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس 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