تا اینجا روش آزمایش تولید کنندههای کد، صرفا بر اساس کامپایل برنامه و مشاهدهی خروجی نهایی آن بود و یا حتی با ترفندهایی امکان دیباگ آنها نیز وجود دارد که البته هنوز در تمام IDEها پشتیبانی نمیشود. در این قسمت میخواهیم این وضعیت را بهبود بخشیده و برای تولید کنندههای کد، آزمون واحد بنویسیم که یکی از مزایای آن، فراهم بودن امکان دیباگ یک چنین پروژههایی در تمام IDEهای موجود است و برای انجام اینکار، نیاز به هیچ ترفند خاصی وجود ندارد و ...
در حین توسعهی Source Generators، نیاز میشود تا بتوان تنظیماتی را از استفاده کننده دریافت کرد؛ برای مثال تعیین فضای نام ویژهای، فعال و غیرفعال کردن قابلیتی و یا حتی دریافت فایلهای تکمیلی. این تنظیمات سفارشی از طریق تعریف آنها در فایلهای csproj. و خواص MSBuild قابل دسترسی هستند که روش کار با آنها را در ادامه مرور خواهیم کرد.
روش تعریف خواص سفارشی MSBuild در پروژهی Source Generator
در مثال همین سری، به پوشهی ...
همانطور که در قسمت اول این سری نیز عنوان شد، انجام عملیات Reflection عموما به همراه سربار محاسبهی هربارهی اطلاعات مورد نیاز آن است و اکنون میتوان یک چنین محاسباتی را توسط Source generators، در زمان کامپایل برنامه، تامین و جزئی از خروجی نهایی کامپل شدهی آن کرد تا کارآیی برنامه به شدت افزایش یابد. یک نمونه مثال آن، استفاده از ویژگی Display بر روی عناصر یک enum است تا بتوان توضیحات بیشتری را جهت نمایش در UI، ارائه داد: using System ...
یک مثال: پیاده سازی INotifyPropertyChanged توسط Source Generators
هدف از اینترفیس INotifyPropertyChanged که به همراه یک رخداد است: public interface INotifyPropertyChanged
{
event PropertyChangedEventHandler PropertyChanged;
}
مطلع سازی استفاده کنندهی از یک شیء، از تغییرات رخدادهی در مقادیر خواص آن است که نمونهی آن، در برنامههای WPF، جهت به روز رسانی UI، ز ...
Source Generators که به همراه C# 9.0 ارائه شدند، یک فناوری نوین meta-programming است و به عنوان جزئی از پروسهی استاندارد کامپایل برنامه، ظاهر میشود. هدف اصلی از ارائهی Source Generators، تولید کدهای تکراری مورد استفادهی در برنامهها است. برای مثال بجای انجام کارهای تکراری مانند پیاده سازی متدهای GetHashCode، ToString و یا حتی یک AutoMapper و یا Serializer، برای تمام کلاسهای برنامه، Source Generators میتوانند آنها را به صورت خودکار پ ...
طرح مشکل! نیاز به دریافت انواع و اقسام مقادیر یک جنس (مانند اعداد و یا تاریخ) در کامپوننتهای Blazor
فرض کنید میخواهید عددی را در کامپوننتی، دریافت کنید. میتوان اینکار را با تعریف یک پارامتر عمومی به صورت زیر انجام داد: [Parameter] public int Value { get; set; }
و ... مشکل از همینجا شروع میشود! خوب، برای نوعهای double ، decimal ، float ، long و غیره چه باید کرد؟ آیا باید به ازای هر کدام، یک پارامتر مخصوص را تعریف ...
در مواقع بسیاری پیشمیاد که در توسعهی لاجیک پروژهها، نیازمند روند اعتبارسنجی و برگرداندن exception به سمت بخشهای دیگر هستیم. معمولا توسعه دهندگان دات نت به صورت توکار و دستی این validationها را انجام میدهند. یک مثال برایتان میزنم: public class Person
{
public string Firstname { get; private set; }
public string Lastname { get; private set; }
private Person(string firstname, string lastname)
{
...
عموما زمانیکه میخواهیم تمام وظایف مدنظر، به صورت موازی اجرا شوند، آنها را Task.WhenAll میکنیم . برای مثال 10 هزار درخواست HTTP را به صورت وظایفی، WhenAll میکنیم و ... در این حالت ... سرور ریموت، IP شما را خواهد بست! چون کنترلی بر روی تعداد وظیفهی در حالت اجرای موازی وجود ندارد و یک چنین عملی، شبیه به یک حملهی DDOS عمل میکند! برای مدیریت بهتر یک چنین مواردی، در دات نت 6 متدهای Parallel.ForEachAsync ارائه شدهاند تا دیگر نیازی به است ...
در ادامهی طراحی مبتنی بر مینیمالیسم C# 10.0، پس از پیشفرض شدن « top level programs » و همچنین « کاهش تعداد بار تعاریف usingها »، تغییر سوم صورت گرفتهی در قالبهای پروژههای مبتنی بر دات نت 6، ساده سازی تعاریف فضاهای نام است. برای مثال یک کنترلر، به این صورت تعریف شدهاست: namespace mvc.Controllers;
public class HomeController : Controller
{
}
که به آن «File-Scoped Namespaces» هم گفته میشود.
بررسی مفهوم «F ...
در مطلب « روش بازگشت به قالبهای کلاسیک پروژهها در دات نت 6 » مشاهده کردیم که قالب پیشفرض یک برنامهی کنسول دات نت 6، چنین فایل Program.cs ای را تولید میکند: // See https://aka.ms/new-console-template for more information
Console.WriteLine("Hello, World!");
که در حقیقت همان اجبار به استفادهی از سبک « Top Level Programs » ارائه شدهی در C# 9.0 است. اما اگر به همین دو سطر هم دقت کنید، یک تفاوت مهم را با نمونهی C# 9.0 ...