در برنامهنویسی داتنت، یکی از چالشهای رایج، نیاز به ایجاد یک فایل پروژه (Project File) حتی برای سادهترین برنامههای کنسولی است. این موضوع میتواند برای اسکریپتنویسی سریع یا اجرای قطعه کدهای کوچک، دست و پا گیر باشد. با معرفی قابلیت دستورات نادیده گرفته شده سیشارپ (C# Ignored Directives) در .NET 10 Preview 4، گامی بزرگ در جهت رفع این چالش برداشته شده است. این قابلیت به توسعهدهندگان اجازه میدهد تا فایلهای کد منبع سیشارپ را مستقیماً از خط فرمان (CLI) بدون نیاز به فایل پروژه کامپایل و اجرا کنند، که رویکردی نوآورانه و قدرتمند در زمینه اسکریپتنویسی سیشارپ محسوب میشود.
این مقاله آموزشی به بررسی عمیق دستورات نادیده گرفته شده سیشارپ میپردازد، تفاوت آنها را با دستورات پیشپردازنده (Preprocessor Directives) توضیح میدهد، کاربردهای کلیدی آنها را به همراه مثالهای عملی نمایش میدهد و نحوه تبدیل یک فایل اسکریپت به یک پروژه کامل را تشریح میکند. هدف این است که توسعهدهندگان داتنت با سطوح تجربه مختلف، بتوانند از این قابلیت جدید به بهترین شکل ممکن استفاده کرده و فرآیند توسعه خود را بهینه کنند.
دستورات پیشپردازنده در مقابل دستورات نادیده گرفته شده سیشارپ
برای درک بهتر دستورات نادیده گرفته شده، ابتدا باید تفاوت آنها را با دستورات پیشپردازنده سیشارپ درک کرد.
دستورات پیشپردازنده (Preprocessor Directives)
دستورات پیشپردازنده (Preprocessor Directives) در سیشارپ ابزارهایی قدرتمند برای نوشتن کدهایی هستند که میتوانند به صورت مشروط (Conditionally) کامپایل شوند. این کامپایل مشروط میتواند بر اساس عواملی مانند فریمورک هدف (Target Framework)، پلتفرم هدف (Target Platform)، یا پیکربندی ساخت (Build Configuration) متغیر باشد. به عنوان مثال، میتوانید بخشهایی از کد را فقط برای نسخههای خاصی از .NET یا پلتفرمهای خاصی مانند اندروید یا در حالت دیباگ (Debug mode) فعال کنید. برخی از مثالهای رایج عبارتند از:
#if NET9_0_OR_GREATER
// این کد فقط در .NET 9 یا بالاتر اجرا میشود
#endif
#if ANDROID
// این کد فقط در سیستم عامل اندروید اجرا میشود
#endif
#if DEBUG
// این کد فقط در حالت دیباگ اجرا میشود
#endif
این دستورات مستقیماً توسط کامپایلر (Compiler) پردازش میشوند و بر نحوه تولید کد اجرایی نهایی تأثیر میگذارند.
دستورات نادیده گرفته شده (Ignored Directives)
بر خلاف دستورات پیشپردازنده، دستورات نادیده گرفته شده (Ignored Directives) دارای ساختاری مشابه هستند اما توسط کامپایلر نادیده گرفته میشوند. دلیل این امر این است که این دستورات برای ابزارهای توسعه (Tooling) در نظر گرفته شدهاند و نه برای منطق کامپایل کد. هدف اصلی این ویژگی، همانطور که پیشتر ذکر شد، امکان اجرای مستقیم یک فایل کد منبع (Source File) سیشارپ از خط فرمان (CLI) بدون نیاز به تعریف یک فایل پروژه است. این رویکرد به طور قابل توجهی پیچیدگی را کاهش میدهد، به خصوص برای اسکریپتهای کوچک یا برنامههای تکفایلی.
دستورات نادیده گرفته شده کلیدی در .NET 10 Preview 4 و نحوه استفاده از آنها
در .NET 10 Preview 4، چهار دستور نادیده گرفته شده اصلی پیادهسازی شدهاند که هر یک کاربرد خاص خود را دارند:
1. Shebang (Hashbang)
این دستور که به صورت #!/usr/bin/dotnet run نوشته میشود، عمدتاً در سیستمعامل لینوکس (Linux) پشتیبانی میشود. شیبنگ (shebang) یا هَشبنگ (hashbang) باید اولین خط فایل کد منبع باشد و به پوسته (Shell) سیستمعامل اعلام میکند که فایل باید با استفاده از dotnet run اجرا شود. این ویژگی امکان اجرای مستقیم فایل سیشارپ را مانند یک اسکریپت اجرایی فراهم میکند.
2. انتخاب SDK متفاوت (SDK Directive)
دستور #:sdk به شما امکان میدهد تا یک کیت توسعه نرمافزار (SDK) متفاوت را به جای SDK پیشفرض استفاده کنید. این امر به ویژه زمانی مفید است که نیاز به استفاده از SDKهای خاص مانند Microsoft.NET.Sdk.Razor برای توسعه وب دارید:
#:sdk Microsoft.NET.Sdk.Razor
3. تعریف ویژگیهای پروژه (Property Directive)
دستور #:property برای تعریف ویژگیهای پروژه (Project Properties) به کار میرود. این ویژگیها میتوانند شامل فریمورک هدف (TargetFramework)، نوع خروجی (OutputType) و سایر تنظیمات مربوط به پروژه باشند. شما میتوانید چندین دستور #:property را در یک فایل استفاده کنید:
#:property TargetFramework net10.0
#:property OutputType WinExe
4. ارجاع به پکیج NuGet (Package Directive)
با استفاده از دستور #:package، میتوانید به پکیجهای نوگت (NuGet Packages) در فایل اسکریپت خود ارجاع دهید. این امکان دسترسی به کتابخانههای شخص ثالث را بدون نیاز به فایل پروژه فراهم میکند. این دستور از نسخهبندی پویا (Dynamic Versioning) نیز پشتیبانی میکند:
#:package Microsoft.Extensions.Hosting 10.*-*
قوانین استفاده از دستورات نادیده گرفته شده
برای استفاده صحیح از این دستورات، رعایت چند قانون ضروری است:
- هر دستور باید در یک خط جداگانه قرار گیرد.
- تمامی تعاریف دستورات نادیده گرفته شده باید قبل از هر توکن کامپایل (Compilation Token) معتبر سیشارپ، از جمله
define#، قرار گیرند. - دستور
#:sdk فقط یک بار قابل تعریف است، اما دستورات #:property و #:package میتوانند چندین بار استفاده شوند. - برای دستور
#:sdk، یک شناسه (Identifier) SDK معتبر باید با یک فاصله (Whitespace) از آن پیروی کند. - برای دستورات
#:property و #:package، یک شناسه معتبر و مقدار آن باید با یک فاصله از دستور پیروی کنند. - دستور شیبنگ (
#!) باید اولین خط فایل باشد و قبل از نشانگر ترتیب بایت (BOM) قرار گیرد تا توسط پوسته سیستمعامل تشخیص داده شود. - هر دستور نامعتبر دیگری به عنوان خطا گزارش خواهد شد.
مثالهای کاربردی: از کنسول تا ویندوز فرمز
برای درک بهتر نحوه عملکرد دستورات نادیده گرفته شده، به بررسی چند مثال عملی میپردازیم:
1. برنامه کنسولی ساده
برای یک برنامه کنسولی (Console Application) که از SDK و ویژگیهای پیشفرض استفاده میکند، میتوانید فایل Console.cs را به صورت زیر ایجاد کنید:
Console.WriteLine("Hello, C#!!!");سپس، با استفاده از دستور dotnet run Console.cs در خط فرمان، آن را اجرا کنید. این سادهترین حالت استفاده است و قابلیت top-level statements را به خوبی نمایش میدهد.
2. برنامه ویندوز فرمز (WinForms Application)
ایجاد یک برنامه ویندوز فرمز (WinForms Application) با استفاده از دستورات نادیده گرفته شده، نیاز به تعریف ویژگیهای خاصی دارد. فایل Forms.cs را به صورت زیر ایجاد کنید:
#:property TargetFramework net10.0-windows
#:property UseWindowsForms true
#:property OutputType WinExe
Application.Run(new Form() { Text = "Hello C#" });برای اجرای این فایل، دستور dotnet run Forms.cs را در خط فرمان وارد کنید. همانطور که مشاهده میکنید، بدون نیاز به فایل .csproj، یک برنامه گرافیکی ویندوز اجرا میشود. به همین ترتیب، امکان ساخت یک برنامه وب داتنت با مینیمال API (Minimal API) نیز فراهم است.
3. استفاده از Hashbang در لینوکس
همانطور که پیشتر اشاره شد، ویژگی هَشبنگ (Hashbang) فقط در لینوکس کار میکند. اگر فایل Console.cs شما به صورت زیر باشد:
#!/usr/bin/dotnet run
Console.WriteLine("Hello, C#!!!");پس از ذخیره فایل، برای اعطای دسترسی اجرایی، دستور زیر را در ترمینال لینوکس اجرا کنید:
chmod +x Console.cs
حالا میتوانید فایل را مستقیماً از خط فرمان مانند یک فایل اجرایی اجرا کنید:
./Console.cs
تبدیل اسکریپت به پروژه و محدودیتها
یکی از قابلیتهای مفید مرتبط با این دستورات، امکان تبدیل یک فایل اسکریپت حاوی دستورات نادیده گرفته شده به یک فایل پروژه کامل است.
تبدیل به پروژه
ابزارهای توسعه (Tooling) پشتیبانی لازم برای انتقال کد منبع به یک پروژه را فراهم میکنند. با استفاده از دستور dotnet project convert Forms.cs، یک فایل پروژه جدید ایجاد میشود و تمام دستورات نادیده گرفته شده (مانند #:property و #:package) به ویژگیهای پروژه و ارجاعات پکیجهای مربوطه در فایل .csproj منتقل میشوند. این قابلیت بسیار مفید است، زیرا به شما اجازه میدهد تا با یک اسکریپت شروع کنید و در صورت نیاز به توسعه بیشتر، به راحتی آن را به یک پروژه استاندارد داتنت تبدیل کنید.
محدودیتها
با وجود تمام مزایای این قابلیت، چند محدودیت نیز وجود دارد که باید در نظر گرفته شود:
- دستور
dotnet run در حال حاضر تنها یک فایل را به عنوان پارامتر میپذیرد. حتی اگر چندین فایل به آن داده شود، تنها فایل اول پردازش شده و بقیه نادیده گرفته میشوند.
نتیجهگیری: آینده اسکریپتنویسی سیشارپ
معرفی دستورات نادیده گرفته شده در سیشارپ یک گام مهم رو به جلو برای سادهسازی توسعه و اسکریپتنویسی در اکوسیستم داتنت است. این قابلیت به توسعهدهندگان این امکان را میدهد که با سرعت بیشتری نمونهسازی (Prototyping) کنند، اسکریپتهای یکبار مصرف بسازند و بدون نیاز به سربار (Overhead) یک فایل پروژه، ایدههای خود را آزمایش کنند. با توانایی تعریف SDK، ویژگیهای پروژه و ارجاع به پکیجهای NuGet، این اسکریپتها میتوانند بسیار قدرتمند باشند و طیف وسیعی از کاربردها را پوشش دهند، از برنامههای کنسولی ساده گرفته تا برنامههای ویندوز فرمز و حتی برنامههای وب مینیمال.