آشنایی با Top-Level Statements قابلیت C# 9.0

قابلیت Top-Level Statements، ویژگی جدیدی هست که در C# 9.0 اضافه شده. اما این ویژگی جدید چی هست و چه کاربردی داره؟بیاین با هم ببینیم.فرض کنید می خواین دو خط برنامه بنویسین که عبارت معروف Hello World رو چاپ کنه. در زبان C# حداقل کدی که زده می شه چیزی در حد کد زیر هست:using System;class Program{ static void Main() // Program entry point { Console.WriteLine("Hello, world"); }}گفتم در زبان C# باید اینقدر کد بزنیم؟ خوب حرف نادقیقی بود. درستش اینه که بگم در زبان C# نسخه های 8 و کمتر. چون در نسخه 9.0 ما این قابلیت رو داریم که به جای چند خط بالا، سه خط زیر رو بنویسیم و کار کنه:using System;Console.WriteLine ("Hello, world");این دو خط رو می نویسین و بعد با دستور زیر برنامه رو اجرا می کنید و می بینید که به راحتی کار می کنه>> dotnet runنیاز به آرگومان های ورودی دارین؟ این قابلیت هم به راحتی در اختیار شماست! کافیه داخل کد از args استفاده کنید مثل مثال زیر:using System;foreach (var s in args){ Console.Write(s); Console.Write(' ');}و بعد به صورت زیر آرگومان های مد نظرتون رو بهش پاس بدین:>> dotnet run -- hello everybodyhello everybodyاما در واقع چه اتفاقی داره می افته؟ بیاین یکم بیشتر با این ویژگی آشنا بشیم.یک فایل با Top-Level Statements به ترتیب شامل سه بخش زیر می شه (دقت کنید دو بخش اختیاری هست) :1- (اختیاری) عبارات using2- یک سری از عبارات (Statements) که به دلخواه یا در صورت نیاز با declaration توابع ترکیب می شوند.3- (اختیاری) declaration نوع ها (Type) و namespace هامثلاusing System; // Part 1Console.WriteLine ("Hello, world"); // Part 2void SomeMethod1() { ... } // Part 2Console.WriteLine ("Hello again!"); // Part 2void SomeMethod2() { ... } // Part 2class SomeClass { ... } // Part 3namespace SomeNamespace { ... } // Part 3اما در زمان کامپایل چه اتفاقی می افته؟ چون CLR این عبارات رو به همین شکل پشتیبانی نمی کنه، کامپایلر، این کد رو به چیزی شبیه کدهای زیر تبدیل می کنه:using System; // Part 1static class Program$ // Special compiler-generated name{ static void Main$() // Special compiler-generated name{ Console.WriteLine("Hello, world"); // Part 2 void SomeMethod1() { ... } // Part 2 Console.WriteLine("Hello again!"); // Part 2 void SomeMethod2() { ... } // Part 2 }}class SomeClass { ... } // Part 3namespace SomeNamespace { ... } // Part 3دقت کنید که هر چیزی که در بخش 2 هست داخل متد main قرار می گیره. پس در نتیجه متدهایی مثل SomeMethod1 و SomeMethod2 مثل متدهای محلی (local methods) رفتار می کنند. که خوب این مسئله یعنی اینکه اولا، این متدهای محلی می تونند به متغیرهای تعریف شده، در متدی که اونها تعریف شده اند، دسترسی داشته باشن،int x = 3;LocalMethod();void LocalMethod() { Console.WriteLine (x); } // We can access xثانیا این متدهای محلی از طریق سایر کلاس ها و typeها قابل دستیابی نیستند.در انتها دو نکته دیگه در مورد Top-Level Statements می شه گفت یکی اینکه این عبارات می تونند به دلخواه یک مقدار Integer رو به کسی آنها رو فراخوانی کرده برگردونند و دوم اینکه از اونجایی که هر برنامه فقط یک نقطه شروع داره، پس حداکثر در یک فایل در یک پروژه می شه از Top-Level Statements استفاده کرد.امیدوارم که این مطلب براتون مفید بوده باشه و اگر مشکل یا خطایی در اون می بینید خوشحال می شم که به من اطلاع بدین.من برای نوشتن این مطلب از دو منبع زیر استفاده کردم:1- C# 9.0 in a Nutshell The Definitive Reference by Joseph Albahari - O'Reilly2- Tutorial: Explore ideas using top-level statements to build code as you learn