الأساليب العامة
معاملات النوع في الأساليب
الأساليب العامة درس مجاني في C# Academy على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في C# Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة C# Academy 4 دروس في المجموع.
ما الأساليب العامة؟
يصرّح الأسلوب العام بمعامل نوع واحد أو أكثر خاص به، وتُكتب هذه المعاملات بين أقواس زاوية بعد اسم الأسلوب. ثم يعمل جسم الأسلوب نفسه مع أنواع متعددة دون تحويلات أو تكرار.
معاملات النوع عبارة عن عناصر نائبة مثل T. ويستبدل المترجم النوع الحقيقي بها عند موضع الاستدعاء، مع الحفاظ على أمان الأنواع.
void Print<T>(T value)
{
Console.WriteLine(value);
}التصريح عن معامل نوع
تأتي قائمة معاملات النوع <T> بين اسم الأسلوب وقائمة الوسائط. ويمكنكم استخدام T كنوع لوسيطة أو نوع للقيمة المعادة أو نوع لمتغير محلي داخل الجسم.
من المعتاد تسمية معامل النوع المفرد T؛ كما تُستخدم أسماء وصفية مثل TKey كثيرًا.
T Echo<T>(T input)
{
return input;
}الاستدعاء مع استنتاج النوع
عادةً لا تحددون وسيطة النوع صراحةً. يستنتج المترجم T من الوسيطات التي تمررونها.
هنا، يؤدي Echo(42) إلى استنتاج T = int، بينما يؤدي Echo(\"hi\") إلى استنتاج T = string. يحافظ استنتاج النوع على نظافة استدعاءات الأنواع العامة وسهولة قراءتها.
using System;
class Program
{
static T Echo<T>(T input) => input;
static void Main()
{
Console.WriteLine(Echo(42));
Console.WriteLine(Echo("hi"));
}
}وسيطات النوع الصريحة
عندما يتعذر على الاستنتاج تحديد النوع، أو عندما ترغبون في تحديده صراحةً، مرروا وسيطة النوع بين قوسين زاويين عند موضع الاستدعاء.
يكون ذلك مطلوبًا عندما لا تحمل أي وسيطة النوع، مثل أسلوب تظهر فيه T في نوع الإرجاع فقط.
T Create<T>() where T : new() => new T();
// call:
var list = Create<int>();معلمات أنواع متعددة
يمكن لأسلوب عام التصريح بعدة معلمات أنواع تفصل بينها فواصل. ويُستنتج كل منها أو تُمرر بشكل مستقل.
ومن الأمثلة الشائعة دالة تبديل أو منشئ زوج يخلط بين نوعين مختلفين.
(TSecond, TFirst) Flip<TFirst, TSecond>(TFirst a, TSecond b)
{
return (b, a);
}تبديل عام
تتألق الأساليب العامة في الأدوات التي لا تعتمد على النوع الفعلي. إذ يعيد أسلوب التبديل ترتيب قيمتين من أي نوع متطابق.
تتيح الكلمة الأساسية ref للأسلوب تعديل متغيرات المستدعي مباشرةً في مواضعها.
using System;
class Program
{
static void Swap<T>(ref T a, ref T b)
{
T temp = a;
a = b;
b = temp;
}
static void Main()
{
int x = 1, y = 2;
Swap(ref x, ref y);
Console.WriteLine($"{x} {y}");
}
}القيود على معلمات الأسلوب
يمكن لأسلوب عام تقييد معلمات أنواعه باستخدام عبارة where. وتخبر القيود المترجم بالعمليات المسموح بإجرائها على T.
تتيح where T : IComparable<T> أدناه استدعاء CompareTo بأمان داخل جسم الأسلوب.
T Max<T>(T a, T b) where T : IComparable<T>
{
return a.CompareTo(b) >= 0 ? a : b;
}الأساليب العامة في الفئات غير العامة
لا يلزم أن تكون الفئة عامة لكي تحتوي على أساليب عامة. وغالبًا ما تحتوي فئات الأدوات الثابتة عليها.
يُبقي ذلك الأدوات المساعدة العامة مجمعةً معًا من دون إلزام الفئة بأكملها بحمل معلمة نوع.
static class Util
{
public static T First<T>(T[] items) => items[0];
}الاستنتاج من المصفوفات
يعمل استنتاج النوع أيضًا من خلال وسيطات المصفوفات والمجموعات. إذ يؤدي تمرير int[] إلى استنتاج T = int تلقائيًا.
يجعل ذلك الخوارزميات العامة تبدو كأنها ميزات مضمنة في اللغة.
using System;
class Program
{
static T First<T>(T[] items) => items[0];
static void Main()
{
int[] nums = { 10, 20, 30 };
Console.WriteLine(First(nums));
}
}لماذا لا نستخدم object فحسب؟
قبل ظهور الأنواع العامة، كانت الشيفرة تستخدم object وعمليات التحويل. وكان ذلك يفقدها أمان النوع ويؤدي إلى تغليف أنواع القيم، مما يضر بالأداء.
تتجنب الأساليب العامة تغليف أنواع القيم، وتكتشف أخطاء الأنواع وقت الترجمة بدلًا من طرحها وقت التشغيل.
// Unsafe: needs a cast and can fail at runtime
object Echo(object o) => o;
int n = (int)Echo(5);إرجاع أنواع مختلفة
يمكن أن يكون نوع الإرجاع نفسه عامًا، مما يتيح لأسلوب واحد تشكيل ناتجه وفقًا للمستدعي. وتُرجع default(T) قيمة الصفر لأنواع القيم، أو null للأنواع المرجعية.
يفيد ذلك في توفير بدائل آمنة عند عدم توفر قيمة.
T OrDefault<T>(bool ok, T value)
{
return ok ? value : default(T);
}تحقق سريع
اختبروا مدى فهمكم للأساليب العامة.
مراجعة
تصرّح الأساليب العامة بمعلمات أنواعها الخاصة بين قوسين زاويين بعد الاسم. ويستنتج المترجم النوع عادةً من الوسيطات، لكن يمكنكم تمريره صراحةً.
تحافظ هذه الأساليب على أمان النوع، وتتجنب التغليف، ويمكنها حمل قيود where. ويمكن وضعها في أي فئة، عامةً كانت أم غير عامة.
الأسئلة الشائعة
هل درس «الأساليب العامة» مجاني؟
نعم — نص درس «الأساليب العامة» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة C# Academy، انتقل إلى CoddyKit PRO. تتضمن دورة C# Academy 4 دروس في المجموع.
ماذا ستتعلم في «الأساليب العامة»؟
معاملات النوع في الأساليب تتمرن على C# Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ C# Academy؟
لا تُشترط خبرة سابقة. C# Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.
كم من الوقت يستغرق درس «الأساليب العامة»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس C# Academy هذا؟
نعم. كل درس في C# Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- الأساليب العامة
- الفئات العامة
- قيود where
- الواجهات العامة