الأعضاء ذات البنية التعبيرية (Expression-Bodied Members)
جزء من قسم البرمجة كائنية التوجه في رحلة C# على Coddy. الدرس 14 من 70.
توفر الأعضاء ذات الصيغة المعتمدة على expression بنية مختصرة للأعضاء التي تحتوي على تعبير واحد فقط. وبدلاً من كتابة أجسام كاملة للـ method أو الخاصية باستخدام الأقواس المعقوفة، تستخدم بنية السهم =>.
بالنسبة إلى الأساليب التي تُرجع تعبيرًا واحدًا، يمكنك استبدال الجسم بالكامل:
// الطريقة التقليدية
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();
}حتى يمكن للـ constructors استخدام هذه الصيغة عندما تحتوي على عبارة واحدة:
public class Person
{
public string Name { get; }
public Person(string name) => Name = name;
}تجعل الأعضاء ذات جسم التعبير التعليمات البرمجية أكثر قابلية للقراءة عندما يكون المنطق بسيطًا. استخدمها للعمليات المباشرة، ولكن التزم بالأجسام التقليدية عندما تحتاج إلى عبارات متعددة أو منطق معقد.
التحدي
سهللنُنشئ حاسبة لأسعار المنتجات تستعرض قوة الأعضاء ذوي الصياغة التعبيرية لكتابة تعليمات برمجية نظيفة وموجزة.
ستُنشئ ملفين لتنظيم تعليماتك البرمجية:
Product.cs: عرّف فئةProductفي مساحة الأسماءStore. يجب أن توضّح هذه الفئة أعضاءً مختلفين ذوي صياغة تعبيرية:- خاصية
Name(string) مُنفَّذة تلقائيًا، وخاصيةBasePrice(decimal) - مُنشئًا ذا صياغة تعبيرية يعيّن الخاصيتين معًا
- خاصية للقراءة فقط
TaxAmountذات صياغة تعبيرية تحسب 10% من السعر الأساسي - خاصية للقراءة فقط
TotalPriceذات صياغة تعبيرية تُرجع السعر الأساسي مضافًا إليه مبلغ الضريبة - أسلوبًا
GetDiscount(decimal percentage)ذا صياغة تعبيرية يُرجع مبلغ الخصم (السعر الأساسي مضروبًا في النسبة المئوية مقسومًا على 100) - أسلوبًا
GetFinalPrice(decimal discountPercentage)ذا صياغة تعبيرية يُرجع السعر الإجمالي مطروحًا منه الخصم
- خاصية
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.00
Tax (10%): 100.00
Total Price: 1100.00
Discount (15%): 150.00
Final Price: 950.00نسّق كل قيمة نقدية بحيث تحتوي على منزلتين عشريتين بالضبط، مثل value.ToString("F2") أو $"{value:F2}". وينطبق ذلك على السعر الأساسي والضريبة والإجمالي والخصم والسعر النهائي على حد سواء.
تذكّر استخدام صياغة السهم => لجميع الأعضاء التي تحتوي على تعبير واحد. فهذا يحافظ على نظافة تعليماتك البرمجية وسهولة قراءتها!
جرّب بنفسك
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}");
}
}يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس البرمجة كائنية التوجه
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تدرّب بنفسك: مترجم C# عبر الإنترنت