یک نکتهی تکمیلی: بهبود روش کار با local functions در C# 8.0
در C# 8.0 امکان تعریف متدهای محلی static نیز اضافه شدهاست:
namespace Sample
{
class StaticLocalFunctions
{
static void Main()
{
ClassicCapture(); // Implicitly captured variables in the method scope
NonCapturing(); // Now we can explicitly prevent that
}
internal static int ClassicCapture()
{
int y;
LocalFunction();
return y;
void LocalFunction() => y = 19;
}
internal static int NonCapturing()
{
int y = 5, x = 7;
return Add(x, y);
static int Add(int left, int right) => left + right;
}
}
}
در این مثال، در متد ClassicCapture، یک متد محلی LocalFunction تعریف شدهاست که استاتیک نیست. به همین جهت میتواند به متغیر y داخل متد در برگیرندهی آن، دسترسی پیدا کند و یا حتی آنرا تغییر دهد. بنابراین جائیکه rerun y صورت میگیرد، مقدار آن 19 خواهد بود.
اما اگر فکر میکنید که این نوع تغییرات نباید داخل متدهای محلی مجاز باشند، اکنون در C# 8.0 میتوانید آنها را استاتیک تعریف کنید تا دسترسی آنها به متغیرهای متد دربرگیرندهی آنها، قطع شود؛ مانند متد استاتیک Add داخل متد NonCapturing که دیگر نمیتواند به صورت مستقیم، به متغیرهای x و y دسترسی پیدا کند.