دات نت 7 به همراه یک source generator جدید به نام LibraryImport است که کار جایگزینی DllImport قدیمی را انجام میدهد. برای مثال تا پیش از دات نت 7 برای فراخوانی یک متد native موجود در یک DLL نوشته شدهی به زبانهای ++C/C، به صورت زیر عمل میشد: [DllImport(
"nativelib",
EntryPoint = "to_lower",
CharSet = CharSet.Unicode)]
internal static extern string ToLower(string str);
// string lower = ToLower("StringToConvert") ...
دات نت 7 به همراه یک Regex Source Generator توکار است که به کمک آن میتوان عبارات باقاعده را تبدیل به کدهای سیشارپ معادل آنها کرد و پیش از اجرای برنامه، آنها را کامپایل و جزئی از خروجی نهایی نمود. این روش نسبت به روش پیشین تولید کدهای معادل عبارات باقاعده در زمان اجرای برنامه، از مزایای زیر برخوردار است:
- اجرای یک عبارت باقاعده سریعتر خواهد شد. در این حالت دیگر نیازی نیست تا در حین اجرای برنامه، منتظر پردازش و تولید کدهای سیش ...
تا اینجا روش آزمایش تولید کنندههای کد، صرفا بر اساس کامپایل برنامه و مشاهدهی خروجی نهایی آن بود و یا حتی با ترفندهایی امکان دیباگ آنها نیز وجود دارد که البته هنوز در تمام 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 میتوانند آنها را به صورت خودکار پ ...
دات نت 6 به همراه source generatorهای توکاری است که میتوانند کار serialization و deserialization نوع JSON را با کارآیی بسیار بیشتری انجام دهند؛ با آزمایشهایی که این بهبود را در حد 40 درصد سریعتر نسبت به حالت متداول آن نمایش میدهند و ... این مساله بسیار مهم است. از این جهت که این روزها، JSON را در همهجا مشاهده میکنیم؛ در Web APIها، در تنظیمات برنامهها، در ارسال پیامها بین برنامهها و غیره. بنابراین هرگونه بهبودی در زمینهی کارآیی se ...
فرض کنید با استفاده از روش متداول زیر، کار ثبت یک واقعه را انجام دادهاید: public class TestController
{
private readonly ILogger<TestController> _logger;
public TestController(ILogger<TestController> logger)
{
_logger = logger;
}
[HttpGet("/")]
public string Get()
{
_logger.LogInformation("hello world");
return "Hello world!";
}
}
در ...