یکی
از ویژگیهای جدید اضافه شده به سی شارپ 9، Attributes on
local functions نام دارد و این توانایی را به ما میدهد تا بر روی متدهای محلی که
درون متدها تعریف میشوند، Attributes قرار دهیم. قابلیت local functions در نسخه 7 سی شارپ اضافه شدهاست و با استفاده از این قابلیت میتوانیم درون یک متد، تابع دیگری را تعریف کنیم و در همان متد، از آن تابع درونی
استفاده کنیم. در واقع تابع درونی، لوکال متد بیرونی است و در خارج از متد بیرونی،
قابل دسترسی نیست. مانند مثال زیر:
// Main method public static void Main() { // Local Function void AddValue(int a, int b) { Console.WriteLine("Value of a is: " + a); Console.WriteLine("Value of b is: " + b); Console.WriteLine("Sum of a and b is: {0}", a + b); Console.WriteLine(); } // Calling Local function AddValue(20, 40); AddValue(40, 60); }
برای بررسی این ویژگی جدید سی شارپ 9.0، از یک مثال استفاده میکنیم. فرض کنید یک برنامهی کنسول را داریم و میخواهیم یک قطعه کد فقط در حالتی در خروجی نوشته شود که برنامه در حالت دیباگ اجرا شده باشد و اگر در حالت ریلیز باشد، در خروجی مشاهده نشود. قبل از نسخهی 9.0 سی شارپ، مجبور هستیم از directive های کامپایلر زبان استفاده کنیم و از طریق آن به کامپایلر بفهمانیم که چه زمانی این قطعه کد را کامپایل کند. مانند مثال زیر:
static void Main(string[] args) { static void DoAction() { // DoAction Console.WriteLine("DoAction..."); } #if DEBUG DoAction(); #endif }
اما با استفاده قابلیت اضافه شدهی در این نسخه از سی شارپ، میتوان روی متدهای محلی هم Attributes اضافه کرد. پس میتوانیم از ConditionalAttribute استفاده کنیم و آن را در بالای متد محلی قرار دهیم و از کامپایلر بخواهیم در حالت دیباگ اجرا شود. مانند کد زیر
static void Main(string[] args) { [Conditional("DEBUG")] static void DoAction() { // Do Action Here Console.WriteLine("Do Action..."); } DoAction(); }
اگر بر روی متدهای محلی C# 8.0 از Attribute استفاده کنیم، با خطای زیر روبرو میشویم:
ErrorCS8400Feature 'local function attributes' is not available in C# 8.0. Please use language version 9.0 or greater.