🚀 کاوش File-based Apps در #C در 10 NET.
سیشارپ همیشه یکجورهایی پُر از تشریفات و ساختارهای اضافی بوده، و خودمان هم این را خوب میدانیم. حتی سادهترین برنامهٔ "Hello World" معمولاً به یک فایل راهحل (solution)، یک فایل پروژه (csproj)، و آنقدر کد boilerplate نیاز داشت که از خودتان میپرسیدید شاید بهتر بود از یک زبان اسکریپتی استفاده میکردید!
خب، مایکروسافت بالاخره صدایمان را شنید. با NET 10، File-based Apps. معرفی شدهاند. و واقعاً وقتش بود.
📌 File-based Apps چیستند؟
ایده بسیار ساده است:
کد #C خود را در یک فایل تکی cs. بنویسید و مستقیم اجرا کنید. همین.
نیازی نیست برای یک اسکریپت کوچک که میخواهید چند فایل CSV را پردازش کنید یا یک API endpoint را تست کنید، یک ساختار کامل پروژه بسازید.
در این حالت همچنان همهٔ چیزهایی که #C را فوقالعاده میکنند حفظ میکنید:
🔸️type safety
🔸️performance
کتابخانههای قدرتمند استاندارد💪🏻
اما حالا میتوانید از #C برای اسکریپتهای موقتی استفاده کنید؛ جاهایی که ساختن یک پروژهٔ کامل تبدیل به یک دردسر اضافه میشود.
و بله:
• میتوانید NuGet package اضافه کنید
• میتوانید پروژههای دیگر #C را reference کنید
• میتوانید SDK خاصی را هدف قرار دهید
• و تنظیمات پروژه را فقط با یک فایل انجام دهید
همهٔ این کارها از طریق directiveهایی که با :# شروع میشوند.
این قابلیت روی قابلیت top-level statements که در C# 9 معرفی شد ساخته شده. اگر قرار است اجازه دهیم مردم کلاس و متد Main را حذف کنند، خب چرا اجازه ندهیم کل فایل پروژه را هم حذف کنند؟
🚀 شروع کار با File-based Apps
فرض کنید میخواهید سریع بررسی کنید یک تاریخ مشخص مربوط به چه روزی از هفته است. کافی است یک فایل با نام date-checker.cs بسازید:
var targetDate = new DateTime(2025, 12, 31);
Console.WriteLine($"New Year's 2025 falls on a {targetDate.DayOfWeek}");
Console.WriteLine($"That's {(targetDate - DateTime.Today).Days} days from now");
و اجرا کنید:
dotnet run date-checker.cs
اولین باری که این دستور را اجرا میکنید، CLI یک مقدار جادوی پشتصحنه انجام میدهد:
🔹️یک پروژهٔ مجازی میسازد
🔹️کد را کامپایل میکند
🔹️همهچیز را cache میکند
🔹️و دفعات بعدی اجرای برنامه تقریباً لحظهای است، چون بهقدری هوشمند است که تشخیص دهد چیزی تغییر کرده یا نه.
📌مثال واقعی: پردازش سریع دادهها
در اینجا است که قضیه جذاب میشود. فرض کنیم لازم باشد خیلی سریع مقداری دادهی JSON را پردازش کنید و یک گزارش تولید کنید.
بیایید با System.Text.Json و CsvHelper یک کار عملی انجام بدهیم:
#:package CsvHelper@33.1.0
using System.Text.Json;
using CsvHelper;
using System.Globalization;
var json = await File.ReadAllTextAsync("sales_data.json");
var sales = JsonSerializer.Deserialize<List<SaleRecord>>(json);
var topProducts = sales
.GroupBy(s => s.Product)
.Select(g => new {
Product = g.Key,
TotalRevenue = g.Sum(s => s.Amount),
UnitsSold = g.Count()
})
.OrderByDescending(p => p.TotalRevenue)
.Take(10);
using var writer = new StreamWriter("top_products.csv");
using var csv = new CsvWriter(writer, CultureInfo.InvariantCulture);
csv.WriteRecords(topProducts);
Console.WriteLine("Report generated! Check top_products.csv");
record SaleRecord(string Product, decimal Amount, DateTime Date);
توجه کنید که در اینجا داریم package reference، عملیات async، LINQ و record typeها را با هم ترکیب میکنیم—همه در یک فایل واحد که کاملاً شبیه یک اسکریپت منسجم عمل میکند. این همان کاری است که معمولاً برای انجامش سراغ Python میرفتید، اما حالا میتوانید در دنیای #C بمانید.