زهرا دشتی
زهرا دشتی
خواندن ۲ دقیقه·۴ سال پیش

توابع محلی یا local function در C#

خوب C# از نسخه 7 خودش پشتیبانی از Local functions رو شروع کرد. خوب حالا این ویژگی چی هست و چه کاربردی داره؟

Local function ها متدهای خصوصی (private) هستند که در داخل یک عضو دیگه به صورت nested تعریف می شن، و فقط همون عضو یا بهتره بگیم container شون می تونه اونها رو صدا بزنه.

اما خوب، شاید بپرسین کاربردش چیه؟ کاربردش اینه که کد رو تمیزتر می کنه، هر کسی کد رو ببینه می فهمه این متد فقط باید داخل این عضو استفاده بشه، از طرفی اگر یک دولوپر دیگه خواست کد بزنه به اشتباه این متد رو در جای نادرست استفاده نمی کنه.

متدهای محلی به متغیرها و سایر متدهای محلی که در container شون هست دسترسی دارن و این تقریبا چاقوی دو طرفه است. یعنی اگرچه کاربردیه ولی ممکنه باعث مشکلاتی هم بشه. برای اینکه در صورت عدم نیاز، بشه جلوی این دسترسی رو گرفت، C# در نسخه 8، این امکان رو فراهم کرد که متدهای محلی بتونن به صورت static تعریف بشن که در نتیجه مانع دستیابی اون متد به سایر متغیرها و متدهای محلی دیگه container اش می شد و از coupling و ارجاع اشتباه و تصادفی به متغییرهای container جلوگیری بشه.

خوب گفتم که متدهای محلی می تونن داخل سایر اعضا تعریف بشن. اما دقیقا یعنی چی؟ یعنی موارد زیر:

· متدها، به ویژه iteratorمتدها و async متدها

· سازنده ها (Constructors)

· پروپرتی ها (Property accessors)

· رویدادها (Event accessors)

· متدهای Anonymous

· عبارات Lambda

· فاینالایزها (Finalizers)

· سایر توابع محلی

توابع محلی می تونن modifier زیر رو داشته باشن:

· از async

· از unsafe

· از static (از نسخه 8 به بعد)

· از extern (از نسخه 9 به بعد) که البته باید static هم باشند.

نکته: قبلا در بحث top-level statement گفته بودیم که هر متدی که در top-level statement تعریف بشه به صورت متد محلی رفتار می کنه.

نکته: توابع محلی نمی تونن Overload بشن.

نکته : یک متد محلی نمی تونه access modifier داشته باشه چون به ذات خودش private هست.

خوب من اینجا خیلی مثال و نمونه نیاوردم، در بیشتر حالاتش خیلی سینتکس پیچیده ای نداره، اما خوب در جاهایی مثل عبارات lambda کمی متفاوته. اگر دوست داشتین و براتون کاربرد داشت توصیه می کنم به مستندات خود ماکروسافت مراجعه کنید که یکی از منابع همین مطلب هم هست.

من برای نوشتن این مطلب از دو منبع زیر استفاده کردم :

1. C# 9.0 in a Nutshell The Definitive Reference by Joseph Albahari - O'Reilly

2. Local functions

csharpdotnetprogramming
شاید از این پست‌ها خوشتان بیاید