‫۲ سال و ۶ ماه قبل، جمعه ۲۹ بهمن ۱۴۰۰، ساعت ۱۶:۰۹
یک نکته‌ی تکمیلی: اضافه شدن متد TryGetNonEnumeratedCount به دات نت 6
public static bool TryGetNonEnumeratedCount(this IEnumerable<T> source, out int count);

زمانیکه متد ()Count را بر روی یک <IEnumerable<T فراخوانی می‌کنیم، دو کار ممکن رخ می‌دهند:
الف) کتابخانه‌ی LINQ سعی می‌کند تا این نوع را به یکی از انواع مشتق شده‌ی از IEnumerable که دارای خاصیت Count است (مانند IList و امثال آن)، تبدیل کند تا بر این اساس بتواند به سرعت تعداد عناصر آن‌را تشخیص دهد.
ب) اگر حالت الف میسر نشد، تمام عناصر IEnumerable را جهت یافتن تعداد آن‌ها، پیمایش و شمارش می‌کند که این عملیات برای مجموعه‌های بزرگ می‌تواند بسیار زمانبر باشد.

اکنون در دات نت 6، حالت امن گزینه‌ی الف، با ارائه‌ی متد الحاقی جدید TryGetNonEnumeratedCount، میسر شده‌است. یعنی اگر مجموعه‌ی مدنظر به همراه خاصیت Count بود، بلافاصله از آن استفاده کرده و خروجی out آن‌را ارائه می‌دهد، در غیراینصورت false را بر می‌گرداند و مقدار count صفر خواهد بود؛ یعنی حالت ب را دیگر هیچگاه اجرا نخواهد کرد و به این ترتیب می‌توان به کنترل بیشتری بر روی API ارائه شده رسید.
if (movies.TryGetNonEnumeratedCount(out int count))
{
    Console.WriteLine($"The count is {count}");
}
else
{
    Console.WriteLine("Could not get a count of movies without enumerating the collection");
}
‫۲ سال و ۶ ماه قبل، جمعه ۲۹ بهمن ۱۴۰۰، ساعت ۱۴:۳۸
یک نکته: RandomNumberGenerator ای که پیشتر متد ساده کننده‌ی GetInt32 را دریافت کرده بود، GetBytes آن هم به دات نت 6 اضافه شده‌است:
byte[] randomBytes = RandomNumberGenerator.GetBytes(100);
‫۲ سال و ۶ ماه قبل، دوشنبه ۲۵ بهمن ۱۴۰۰، ساعت ۲۰:۵۷
ارتقاء به ASP.NET Core 7x

تغییر غیرسازگاری با نگارش‌های قبلی، در ASP.NET Core 7x رخ خواهد که در آن ویژگی [FromServices] که در مطلب جاری بحث شد، پیش‌فرض شده‌است؛ یعنی حتی اگر آن‌را ذکر هم نکردید، مهم نیست و به صورت پیش‌فرض در بین سرویس‌های ثبت شده نیز به دنبال پارامتر اکشن متد مدنظر شما می‌گردد:
Services.AddScoped<SomeCustomType>();

[Route("[controller]")]
[ApiController]
public class MyController : ControllerBase
{
    // Binding from the services
    [HttpPost]
    public ActionResult Post(SomeCustomType service) => Ok();
}
در این مثال، نوع SomeCustomType به صورت یک سرویس، در ابتدای برنامه ثبت شده‌است و همانطور که مشاهده می‌کنید، بدون نیاز به ذکر صریح ویژگی [FromServices]، در اکشن متد Post، مورد استفاده قرار گرفته‌است.
اگر علاقمند به استفاده‌ی از این حالت پیش‌فرض نیستند، روش غیرفعال کردن آن به صورت زیر است:
services.Configure<ApiBehaviorOptions>(options =>
{
     options.DisableImplicitFromServicesParameters = true;
});
‫۲ سال و ۶ ماه قبل، شنبه ۲۳ بهمن ۱۴۰۰، ساعت ۲۰:۲۸
خیر. نیازی نیست و با مطلب جدیدتری جایگزین شده‌است. هرچند یکسری تنظیمات پیش‌فرض دارد که آن‌ها را می‌توانید دقیقا جائیکه services.AddHttpClient را تعریف می‌کنید، اضافه کنید.
‫۲ سال و ۶ ماه قبل، سه‌شنبه ۱۹ بهمن ۱۴۰۰، ساعت ۱۷:۲۶
MariaDbContext جدید را اضافه و تغییرات را بر این اساس اعمال کنید (هر جائی در این صفحه و کدها، SQLiteDbContext مثال زده شده وجود دارد، نمونه‌ی جدید بجای آن قرار می‌گیرد؛ قالب و روش کار یکی است).
‫۲ سال و ۶ ماه قبل، شنبه ۱۶ بهمن ۱۴۰۰، ساعت ۱۶:۰۲
بهبودهای indexes و ranges در دات نت 6

تا پیش از دات نت 6، امکان استفاده‌ی از مفاهیم این مطلب به همراه LINQ میسر نبود؛ اما در دات نت 6 می‌توان آن‌ها را به IEnumerable‌ها نیز اعمال کرد. برای مثال بجای
list.Skip(10).Take(5)
می‌توان نوشت:
list.Take(10..15)
و یا دریافت آخرین 10 عضو:
list.Take(^10..)
و یا دریافت تنها یک عضو از انتها:
list.ElementAt(^1)
‫۲ سال و ۶ ماه قبل، جمعه ۱۵ بهمن ۱۴۰۰، ساعت ۱۷:۴۸
یک نکته‌ی تکمیلی: اضافه شدن امکان تعریف Static Abstract Members به اینترفیس‌های C# 10.0

به همراه C# 8.0، امکان تعریف فیلدها، سازنده‌ها و تخریب‌گرهای استاتیک هم ارائه شد که توسط آن می‌توان پیاده سازی پایه‌ای را بین تمام کلاس‌های پیاده سازی کننده‌ی آن به اشتراک گذاشت. جهت تکمیل این قابلیت در C# 10.0، می‌توان static abstract members را نیز در اینترفیس‌ها تعریف کرد تا هر کدام از کلاس‌های پیاده سازی کننده بتوانند نگارش خاص خودشان را از این عضو، ارائه دهند:
public interface IFruit
{
    static abstract bool HasSeeds { get; }
}
با پیاده سازی‌هایی مانند:
public record Watermelon : IFruit
{
    public static bool HasSeeds => false;
}

public record Apple : IFruit
{
    public static bool HasSeeds => true;
}
و مثالی از استفاده‌ی از آن:
void HasSeeds<T>(T fruit) where T: IFruit {
    Console.WriteLine(T.HasSeeds);
}

HasSeeds(new Apple());
HasSeeds(new Watermelon());
اگر دقت کنید، دسترسی به این خاصیت ویژه، از طریق نوع T، صورت گرفته‌است. مزیت این روش و کاربردهای آن، کاهش نیاز به reflection است، با ارائه‌ی متادیتایی درباره‌ی یک نوع. پیشتر برای دریافت اطلاعات متادیتای نوع‌ها، مجبور به استفاده‌ی reflection برای حل یک چنین مسائلی بودیم.
‫۲ سال و ۷ ماه قبل، یکشنبه ۱۰ بهمن ۱۴۰۰، ساعت ۲۰:۴۴
یک نکته‌ی تکمیلی: یک کامپوننت نباید مقادیر [Parameter]های خودش را بازنویسی کند.

فرض کنید پارامتر Value (از نوع [Parameter]) داخل کامپوننتی تعریف شده‌است. اگر قرار است مقدار این پارامتر را تغییر دهیم، نباید از طریق دسترسی مستقیم به آن، داخل همان کامپوننت صورت گیرد؛ بلکه باید از طریق رخ‌داد ValueChanged به والد و استفاده کننده‌ی از آن اطلاع رسانی شود:
    private void DecrementValue()
    {
        //Value--; <-- Don't do this

        // Do this instead:
        ValueChanged.InvokeAsync(Value - 1);
    }
در غیر اینصورت با رندر بعدی، مقدار این پارامتر به حالت اولیه‌ی آن بازگشت داده می‌شود و یا حتی ممکن است یک حلقه‌ی بی‌نهایی رندر را ایجاد کند و سبب قفل شدن UI شود.
اطلاعات بیشتر و همچنین