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

آشنایی با 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 everybody

hello everybody

اما در واقع چه اتفاقی داره می افته؟ بیاین یکم بیشتر با این ویژگی آشنا بشیم.

یک فایل با Top-Level Statements به ترتیب شامل سه بخش زیر می شه (دقت کنید دو بخش اختیاری هست) :

1- (اختیاری) عبارات using

2- یک سری از عبارات (Statements) که به دلخواه یا در صورت نیاز با declaration توابع ترکیب می شوند.

3- (اختیاری) declaration نوع ها (Type) و namespace ها

مثلا

using System; // Part 1

Console.WriteLine ("Hello, world"); // Part 2

void SomeMethod1() { ... } // Part 2

Console.WriteLine ("Hello again!"); // Part 2

void SomeMethod2() { ... } // Part 2

class SomeClass { ... } // Part 3

namespace SomeNamespace { ... } // Part 3

اما در زمان کامپایل چه اتفاقی می افته؟ چون CLR این عبارات رو به همین شکل پشتیبانی نمی کنه، کامپایلر، این کد رو به چیزی شبیه کدهای زیر تبدیل می کنه:

using System; // Part 1
static 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 3
namespace 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'Reilly

2- Tutorial: Explore ideas using top-level statements to build code as you learn



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