تعريف Extension Methods
اكتبوا أساليب ساكنة باستخدام المُعدِّل this
تعريف Extension Methods درس مجاني في C# Academy على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في C# Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة C# Academy 4 دروس في المجموع.
ما المقصود بالأسلوب الامتدادي؟
يتيح الأسلوب الامتدادي إضافة أساليب جديدة إلى نوع موجود من دون تعديله أو إنشاء نوع مشتق منه. ويمكنكم استدعاؤه كما لو كان أسلوب مثيل، لكنه في الحقيقة أسلوب static خاص.
تكون الأساليب الامتدادية مناسبة جدًا عندما لا تملكون الشفرة المصدرية لنوع ما (مثل string أو int)، لكنكم تريدون منحه سلوكًا جديدًا ومفيدًا.
المتطلبات الثلاثة
لتعريف أسلوب امتدادي، تحتاجون إلى: فئة static، وأسلوب static، ومعامل أول مميز بالكلمة المفتاحية this. ويحدد معامل this النوع الذي توسّعونه.
using System;
public static class StringExtensions
{
public static int WordCount(this string text)
{
if (string.IsNullOrWhiteSpace(text)) return 0;
return text.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries).Length;
}
}
public class Program
{
public static void Main()
{
string sentence = "the quick brown fox";
Console.WriteLine(sentence.WordCount());
}
}استدعاؤه مثل أسلوب المثيل
رغم أن WordCount هو أسلوب static، فإنكم تستدعونه بهذه الصيغة: sentence.WordCount(). ويعيد المترجم كتابة هذا الاستدعاء خلف الكواليس إلى StringExtensions.WordCount(sentence).
using System;
using System.Linq;
public static class StringExtensions
{
public static string Repeat(this string text, int times)
{
return string.Concat(Enumerable.Repeat(text, times));
}
}
public class Program
{
public static void Main()
{
// These two lines do exactly the same thing
Console.WriteLine("ab".Repeat(3));
Console.WriteLine(StringExtensions.Repeat("ab", 3));
}
}يستقبل معامل this المثيل
تصبح القيمة الموجودة إلى يسار النقطة هي معامل this. ويمكنكم إضافة معاملات أخرى بعده، ويمررها المستدعون بالطريقة المعتادة.
using System;
public static class IntExtensions
{
public static bool IsBetween(this int value, int low, int high)
{
return value >= low && value <= high;
}
}
public class Program
{
public static void Main()
{
int age = 25;
Console.WriteLine(age.IsBetween(18, 65));
Console.WriteLine(10.IsBetween(1, 5));
}
}توسيع الأنواع الخاصة بكم
لا تقتصر الأساليب الامتدادية على أنواع المكتبات؛ إذ يمكنكم توسيع الفئات الخاصة بكم أيضًا. وهذا مفيد للحفاظ على نوع أساسي نظيف مع إضافة السلوكيات المساعدة في مكان آخر.
using System;
public class Money
{
public decimal Amount { get; }
public Money(decimal amount) { Amount = amount; }
}
public static class MoneyExtensions
{
public static string ToUsd(this Money m) => "$" + m.Amount.ToString("0.00");
}
public class Program
{
public static void Main()
{
var price = new Money(19.5m);
Console.WriteLine(price.ToUsd());
}
}لا تصل الأساليب الامتدادية إلى الأعضاء الخاصة
الأسلوب الامتدادي هو مجرد أسلوب static موجود في فئة أخرى، ولذلك لا يمكنه استخدام إلا الواجهة العامة للنوع (أو الأعضاء الداخلية عندما يكون في التجميعة نفسها). ولا يمكنه الوصول إلى الحقول الخاصة.
using System;
public class Counter
{
private int _count;
public int Value => _count;
public void Increment() => _count++;
}
public static class CounterExtensions
{
// Can only use public members like Value and Increment
public static bool IsZero(this Counter c) => c.Value == 0;
}
public class Program
{
public static void Main()
{
var c = new Counter();
Console.WriteLine(c.IsZero());
c.Increment();
Console.WriteLine(c.IsZero());
}
}تسلسل الأساليب الامتدادية
بما أن كل أسلوب امتدادي يعيد قيمة، يمكنكم تسلسلها في مسار انسيابي. وتُقرأ هذه الطريقة من الأعلى إلى الأسفل، وهي الأسلوب الذي تستخدمه LINQ.
using System;
public static class TextExtensions
{
public static string Shout(this string s) => s.ToUpper();
public static string Bang(this string s) => s + "!";
}
public class Program
{
public static void Main()
{
string result = "hello".Shout().Bang();
Console.WriteLine(result);
}
}null والأساليب الامتدادية
بخلاف الاستدعاء الحقيقي لأسلوب مثيل، يمكن تشغيل الأسلوب الامتدادي حتى عندما تكون القيمة المستقبِلة هي null، إذ لا يُجرى إلغاء مرجع أي شيء حتى تلمسه شفرتكم. ويتيح ذلك كتابة أدوات مساعدة آمنة مع null.
using System;
public static class StringExtensions
{
public static bool IsBlank(this string text)
{
// text may be null here, and that is fine
return string.IsNullOrWhiteSpace(text);
}
}
public class Program
{
public static void Main()
{
string nothing = null;
Console.WriteLine(nothing.IsBlank());
Console.WriteLine("x".IsBlank());
}
}تتقدم أساليب المثيل على الأساليب الامتدادية
إذا وُجد أسلوب مثيل حقيقي بتوقيع مطابق، يفضّله المترجم دائمًا على الأسلوب الامتدادي. فالأساليب الامتدادية تسد فقط الفجوات التي لا يغطيها النوع أصلًا.
using System;
public static class Ext
{
// This will be ignored because string already has ToString()
public static string ToString(this string s, int n) => s + n;
}
public class Program
{
public static void Main()
{
// Resolves to the built-in instance ToString(), not the extension
Console.WriteLine("value: " + "abc".ToString());
}
}مكتبة مساعدة عملية
يؤدي تجميع الأساليب الامتدادية المرتبطة في فئة static واحدة إلى إنشاء مكتبة أدوات مرتبة. إليكم فئة مساعدة عددية صغيرة يمكنكم إعادة استخدامها في أنحاء المشروع.
using System;
public static class NumberExtensions
{
public static bool IsEven(this int n) => n % 2 == 0;
public static int Squared(this int n) => n * n;
public static double Percent(this int n) => n / 100.0;
}
public class Program
{
public static void Main()
{
Console.WriteLine(4.IsEven());
Console.WriteLine(5.Squared());
Console.WriteLine(50.Percent());
}
}جرّبوا بأنفسكم
اجمعوا ما تعلمتموه: فئة static واحدة تحتوي على عدة أساليب امتدادية متخصصة، مع استدعائها بطريقة انسيابية. هذه هي الطريقة المستخدمة فعلًا لبناء مكتبات الأدوات المساعدة اليومية.
using System;
public static class StringExtensions
{
public static string Capitalize(this string s)
=> string.IsNullOrEmpty(s) ? s : char.ToUpper(s[0]) + s.Substring(1);
public static string Surround(this string s, char c) => c + s + c;
}
public class Program
{
public static void Main()
{
Console.WriteLine("hello".Capitalize().Surround('*'));
}
}اختبار سريع
اختبروا مدى فهمكم لتعريف الأساليب الامتدادية.
مراجعة
تعلمتم أن الأسلوب الامتدادي هو أسلوب static موجود في فئة static، ويستخدم this في معامله الأول. ويُستدعى بصيغة المثيل، لكنه يُترجم إلى استدعاء static عادي.
- المتطلبات الثلاثة: فئة static، وأسلوب static، ومعامل
thisأولًا. - لا يمكن الوصول إلا إلى الأعضاء العامة.
- تتقدم أساليب المثيل دائمًا.
- يمكن تسلسل الأساليب الامتدادية، بل ويمكن تشغيلها حتى مع مستقبلات
null.
الأسئلة الشائعة
هل درس «تعريف Extension Methods» مجاني؟
نعم — نص درس «تعريف Extension Methods» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة C# Academy، انتقل إلى CoddyKit PRO. تتضمن دورة C# Academy 4 دروس في المجموع.
ماذا ستتعلم في «تعريف Extension Methods»؟
اكتبوا أساليب ساكنة باستخدام المُعدِّل this تتمرن على C# Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ C# Academy؟
لا تُشترط خبرة سابقة. C# Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.
كم من الوقت يستغرق درس «تعريف Extension Methods»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس C# Academy هذا؟
نعم. كل درس في C# Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- تعريف Extension Methods
- توسيع الواجهات والأنواع العامة
- حلّ Extension Methods
- تصميم امتدادات جيدة