الدوال المحلية الساكنة
امنعوا الالتقاط من أجل الوضوح والأداء
الدوال المحلية الساكنة درس مجاني في C# Academy على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في C# Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة C# Academy 4 دروس في المجموع.
الدوال المحلية الثابتة
يمنع وضع static على دالة محلية التقاط أي متغيرات محيطة أو this. وهذا يجعل الدالة مستقلة وواضحة، ويجنبها عمليات تخصيص الإغلاقات المخفية.
تعريف دالة محلية ثابتة
أضف المُعدِّل static قبل نوع الإرجاع. ولا يزال بإمكان الدالة استقبال المعلمات وإرجاع القيم، لكنها لا تستطيع الوصول إلى المتغيرات المحلية الخارجية.
using System;
public class Program
{
public static void Main()
{
static int Square(int n) => n * n; // captures nothing
Console.WriteLine(Square(6));
}
}لا يُسمح بالالتقاط
لا يمكن للدالة المحلية الثابتة استخدام المتغيرات المحلية المحيطة. ويجب تمرير كل ما تحتاج إليه كمعلمة، مما يجعل مدخلاتها صريحة.
using System;
public class Program
{
public static void Main()
{
int factor = 3;
// factor must be passed in, not captured
static int Scale(int n, int f) => n * f;
Console.WriteLine(Scale(5, factor));
}
}تجنب عمليات التخصيص المخفية
قد تخصص الدوال المحلية غير الثابتة التي تلتقط المتغيرات كائن إغلاق مخفيًا. أما الدالة المحلية الثابتة فلا تلتقط شيئًا، ولذلك تتجنب عملية التخصيص تلك بالكامل.
using System;
public class Program
{
public static void Main()
{
// Pure helper, no closure object created
static bool IsEven(int n) => n % 2 == 0;
for (int i = 0; i < 5; i++)
Console.WriteLine(i + ": " + IsEven(i));
}
}نية موضحة ذاتيًا
تشير الكلمة المفتاحية static للقارئ إلى أن الدالة المساعدة تعتمد على معلماتها فقط. ويجعل هذا الضمان فهم الدالة واختبارها أسهل.
using System;
public class Program
{
public static void Main()
{
static int Clamp(int value, int lo, int hi)
=> value < lo ? lo : value > hi ? hi : value;
Console.WriteLine(Clamp(15, 0, 10));
Console.WriteLine(Clamp(-3, 0, 10));
}
}يفرض المترجم عدم الالتقاط
إذا أشرت بالخطأ إلى متغير محلي محيط داخل دالة محلية ثابتة، فسيبلغ المترجم عن خطأ. ويساعد ذلك على اكتشاف التبعيات غير المقصودة مبكرًا.
using System;
public class Program
{
public static void Main()
{
int seed = 7;
// Correct: seed is passed explicitly, not captured
static int Mix(int x, int s) => x * 31 + s;
Console.WriteLine(Mix(2, seed));
}
}الدوال المحلية الثابتة مع الاستدعاء الذاتي
لا تزال الدوال المحلية الثابتة تدعم الاستدعاء الذاتي، لأن استدعاء الدالة لنفسها يختلف عن التقاط متغير.
using System;
public class Program
{
public static void Main()
{
static int Power(int baseN, int exp)
=> exp == 0 ? 1 : baseN * Power(baseN, exp - 1);
Console.WriteLine(Power(2, 10));
}
}الدمج مع معلمات out
مثل أي أسلوب، يمكن للدوال المحلية الثابتة استخدام معلمات out، وهو ما يتوافق جيدًا مع نقائها الذي لا يسمح بالالتقاط عند إنشاء دوال مساعدة بأسلوب try-parse.
using System;
public class Program
{
public static void Main()
{
static bool TryParsePositive(string s, out int value)
{
value = 0;
return int.TryParse(s, out value) && value > 0;
}
if (TryParsePositive("42", out int n))
Console.WriteLine("got " + n);
Console.WriteLine(TryParsePositive("-1", out _));
}
}تمرير الدوال المحلية الثابتة كمفوضات
بما أنها لا تلتقط شيئًا، تتحول الدوال المحلية الثابتة إلى مفوضات من دون تخصيص إغلاق، وقد يكون ذلك مهمًا في المسارات كثيرة التنفيذ.
using System;
using System.Collections.Generic;
using System.Linq;
public class Program
{
public static void Main()
{
static bool IsBig(int n) => n > 100;
var nums = new List<int> { 50, 150, 200, 10 };
Console.WriteLine(nums.Count(IsBig));
}
}متى تفضل static
فضّل دالة محلية ثابتة كلما لم تكن الدالة المساعدة بحاجة إلى الحالة المحيطة. فهي توثق النقاء، وتمنع الالتقاط غير المقصود، وقد تكون أكثر كفاءة. ولا تحذف static إلا عندما تحتاج فعلًا إلى الإغلاق على المتغيرات المحلية.
using System;
public class Program
{
public static void Main()
{
static string Describe(int score)
{
if (score >= 90) return "A";
if (score >= 80) return "B";
return "C";
}
Console.WriteLine(Describe(95));
Console.WriteLine(Describe(82));
}
}جرّب بنفسك
اكتب دالة محلية ثابتة نقية ومررها كمسند إلى LINQ. وبما أنها لا تلتقط شيئًا، فإنها تتحول إلى مفوض من دون إغلاق.
using System;
using System.Collections.Generic;
using System.Linq;
public class Program
{
public static void Main()
{
static bool IsLeapYear(int year)
=> (year % 4 == 0 && year % 100 != 0) || year % 400 == 0;
var years = new List<int> { 1900, 2000, 2004, 2021, 2024 };
Console.WriteLine(string.Join(", ", years.Where(IsLeapYear)));
}
}تحقق سريع
استرجع ما تضيفه static إلى الدالة المحلية.
مراجعة
لا تلتقط الدالة المحلية static أي شيء.
- لا يمكنها استخدام المتغيرات المحلية المحيطة أو
this؛ لذلك مرر البيانات عبر المعلمات. - تتجنب عمليات تخصيص الإغلاق المخفية.
- يفرض المترجم قاعدة عدم الالتقاط، فيكتشف التبعيات غير المقصودة.
- فضّل استخدامها كلما لم تكن الدالة المساعدة بحاجة إلى الحالة المحيطة.
الأسئلة الشائعة
هل درس «الدوال المحلية الساكنة» مجاني؟
نعم — نص درس «الدوال المحلية الساكنة» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة C# Academy، انتقل إلى CoddyKit PRO. تتضمن دورة C# Academy 4 دروس في المجموع.
ماذا ستتعلم في «الدوال المحلية الساكنة»؟
امنعوا الالتقاط من أجل الوضوح والأداء تتمرن على C# Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ C# Academy؟
لا تُشترط خبرة سابقة. C# Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.
كم من الوقت يستغرق درس «الدوال المحلية الساكنة»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس C# Academy هذا؟
نعم. كل درس في C# Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- التصريح عن الدوال المحلية
- الإغلاقات والمتغيرات الملتقطة
- الدوال المحلية الساكنة
- الدوال المحلية مقابل Lambdas