الأعضاء ذات البنية التعبيرية (Expression-Bodied Members)
جزء من قسم Object Oriented Programming في رحلة C# على Coddy — الدرس 14 من 70.
توفر الأعضاء المعرفة بالتعبير (expression-bodied members) بناء جملة موجزًا للأعضاء التي تحتوي على تعبير واحد فقط. بدلاً من كتابة نص كامل للميثود (method) أو الخاصية باستخدام الأقواس المعقوفة، فإنك تستخدم بناء الجملة بسهم =>.
بالنسبة للميثودات (methods) التي تعيد تعبيرًا (expression) واحدًا، يمكنك استبدال جسم الميثود بالكامل:
// الطريقة التقليدية
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) لكتابة كود نظيف وموجز.
ستقوم بإنشاء ملفين لتنظيم الكود الخاص بك:
Product.cs: قم بتحديدclassباسمProductداخلnamespaceباسمStore. يجب أن يوضح هذا الـclassأعضاء متعددة ذات بنيةexpression-bodied:- خاصية مُنفذة تلقائيًا (auto-implemented) باسم
Name(من نوع string) وBasePrice(من نوعdecimal) - منشئ (
constructor) ذو بنيةexpression-bodiedيقوم بتعيينbothالخصائص - خاصية للقراءة فقط ذو بنية
expression-bodiedباسمTaxAmountتحسب 10% من الـbaseprice - خاصية للقراءة فقط ذو بنية
expression-bodiedباسمTotalPriceترجع الـbaseprice مضافًا إليهTaxAmount methodذو بنيةexpression-bodiedباسمGetDiscount(decimal percentage)يرجع قيمة الـdiscount(الـbaseprice مضروبًا في الـpercentageومقسومًا على 100)methodذو بنيةexpression-bodiedباسمGetFinalPrice(decimal discountPercentage)يرجع الـtotalpriceminusالـdiscount
- خاصية مُنفذة تلقائيًا (auto-implemented) باسم
Program.cs: في ملفك الرئيسيMain، أنشئ عنصرًاProductباستخدام قيم الـinput، ثم اعرض تفاصيل التسعير.
ستتلقى ثلاثة مدخلات (inputs):
- اسم المنتج
- الـ
Baseprice - نسبة الـ
Discountالمطبقة
اطبع details التسعير بهذا الـ format:
Product: {Name}
Base Price: {BasePrice}
Tax (10%): {TaxAmount}
Total Price: {TotalPrice}
Discount ({percentage}%): {discountAmount}
Final Price: {finalPrice}على سبيل المثال، إذا كانت الـ inputs هي Laptop، و 1000، و 15، يجب أن يكون المخرج:
Product: Laptop
Base Price: 1000.00
Tax (10%): 100.00
Total Price: 1100.00
Discount (15%): 150.00
Final Price: 950.00قم بتنسيق كل قيمة مالية لتكون بخانتين عشريتين بالضبط — على سبيل المثال value.ToString("F2") أو $"{value:F2}". ينطبق ذلك على الـ base price، والضريبة، والـ total، والـ discount والـ final price على حد سواء.
تذكر استخدام صياغة السهم => لجميع الأعضاء التي تحتوي على expression واحد. هذا يجعل كودك نظيفًا وسهل القراءة!
جرّب بنفسك
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());
// أنشئ كائن Product باستخدام قيم الإدخال
Product product = new Product(name, basePrice);
// احسب مبلغ الخصم باستخدام طريقة GetDiscount
decimal discountAmount = product.GetDiscount(discountPercentage);
// احسب السعر النهائي باستخدام طريقة GetFinalPrice
decimal finalPrice = product.GetFinalPrice(discountPercentage);
// اطبع تفاصيل التسعير بالتنسيق المطلوب:
Console.WriteLine($"Product: {product.Name}");
Console.WriteLine($"Base Price: {product.BasePrice:F2}");
Console.WriteLine($"Tax (10%): {product.TaxAmount:F2}");
Console.WriteLine($"Total Price: {product.TotalPrice:F2}");
Console.WriteLine($"Discount ({discountPercentage}%): {discountAmount:F2}");
Console.WriteLine($"Final Price: {finalPrice:F2}");
}
}يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس 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