‫۱ سال و ۸ ماه قبل، چهارشنبه ۷ دی ۱۴۰۱، ساعت ۲۲:۲۷
یک نکته‌ی تکمیلی: وابستگی‌های مورد نیاز جهت کار با SkiaSharp بر روی لینوکس و همچنین Containers

برای کار با این کتابخانه در محیط‌های لینوکسی نیاز به نصب دو بسته‌ی زیر هم هست:
PM> Install-Package SkiaSharp.NativeAssets.Linux.NoDependencies
PM> Install-Package HarfBuzzSharp.NativeAssets.Linux
همچنین فایل csproj. را هم باید به صورت زیر جهت بارگذاری صحیح وابستگی‌های native آن ویرایش کرد:
<Target Name="CopyFilesAfterPublish" AfterTargets="AfterPublish">
    <Copy SourceFiles="$(TargetDir)runtimes/linux-x64/native/libSkiaSharp.so" DestinationFolder="$([System.IO.Path]::GetFullPath('$(PublishDir)'))/bin/" />
    <Copy SourceFiles="$(TargetDir)runtimes/linux-x64/native/libHarfBuzzSharp.so" DestinationFolder="$([System.IO.Path]::GetFullPath('$(PublishDir)'))/bin/" />    
</Target>
‫۱ سال و ۸ ماه قبل، شنبه ۲۶ آذر ۱۴۰۱، ساعت ۱۳:۵۹
بله. متدهای ExecuteUpdate و ExecuteDelete بلافاصله و مستقیما بر روی بانک اطلاعاتی اجرا می‌شوند. به این معنا که:
- چون رکوردهای متاثر، در حافظه بارگذاری نمی‌شوند، تحت نظر سیستم Tracking هم قرار نمی‌گیرند.
- اگر یک متد SaveChanges سفارشی را ایجاد کرده باشید، کدهای آن فراخوانی نمی‌شوند (مستقل و بدون نیاز به SaveChanges اجرا می‌شوند).
- اگر یک SaveChangesInterceptor سفارشی را ایجاد کرده باشید هم در این حالت متدهای بازنویسی شده‌ی آن اجرا نمی‌شوند.
- البته سایر Interceptors مانند DbCommandInterceptor بدون مشکل و همانند قبل اجرا خواهند شد.
- اجرای این متدها، به همراه سایر به‌روز رسانی‌های متداولی که با SaveChanges همراه هستند، در یک تراکنش اجرا نمی‌شوند؛ مگر اینکه به صورت صریحی، یک تراکنش مشخص، برای کل این مجموعه باز شود.
- در این حالت query filters به‌درستی اعمال می‌شوند.
‫۱ سال و ۸ ماه قبل، سه‌شنبه ۲۲ آذر ۱۴۰۱، ساعت ۱۴:۳۹
تبدیل کدهایی که از اندیس‌های آرایه‌ها استفاده می‌کنند به List Patterns matching

فرض کنید قصد داریم با اجزای آرایه‌ی زیر کار کنیم:
var data = "item1|item2|item3";
var collection = data.Split('|');
برای مثال اگر آرایه‌ی collection دارای 2 عضو بود، از طریق collection[0], collection[1] با این دو عضو کار کنیم و یا اگر 3 عضوی بود، به همان صورت بر اساس ایندکس‌ها دسترسی صورت گیرد و اگر این آرایه 2 و یا 3 عضوی نبود، استثنایی را صادر کند. روش متداول انجام اینکار به صورت زیر است:
var formattedDataBefore = collection.Length switch
{
    2 => FormatData(collection[0], collection[1]),
    3 => FormatData(collection[0], collection[1], collection[2]),
    var length => throw new InvalidOperationException($"Expected 3 parts, but got {length} parts for formatted string: {data}."),
};
می‌توان این قطعه کد را با استفاده از List Patterns Matching به صورت زیر بازنویسی کرد:
var formattedDataAfter = collection switch
{
    [var part1, var part2] => FormatData(part1, part2),
    [var part1, var part2, var part3] => FormatData(part1, part2, part3),
    var parts => throw new InvalidOperationException($"Expected 3 parts, but got {parts.Length} parts for formatted string: {data}."),
};

نمونه‌ی دیگر این دسترسی‌های بر اساس ایندکس‌ها، مثال زیر است. در اینجا ساختار شیء Song به صورت زیر تعریف شده‌است:
public class Song
{
    public string Name { get; set; }
    public List<string> Lyrics { get; set; }
}
و فرض کنید songs لیستی از آن است. در این حالت یک روش جستجوی ابتدایی در این لیست، به صورت زیر است که برای مثال اولین Lyrics آن song خاص، مساوی Hello، تعداد Lyrics آن 6 و آخرین عضو Lyrics آن مساوی ? باشد:
for (var i = 0; i < songs.Count; i++)
{
    if (songs[i].Lyrics[0] == "Hello" && songs[i].Lyrics.Count == 6 &&
        songs[i].Lyrics[songs[i].Lyrics.Count - 1] == "?")
    {
        Console.WriteLine($"{i}");
    }
}
می‌توان این قطعه کد را در C# 11 به صورت زیر بازنویسی کرد که بسیار خواناتر است:
for (var i = 0; i < songs.Count; i++)
{
    if (songs[i].Lyrics is ["Hello", _, _, _, _, "?"])
    {
       Console.WriteLine($"{i}");
    }
}
و یا اگر از تعداد Lyrics مساوی 6، صرفنظر کنیم و تعداد اعضای آن مهم نباشد، می‌توان به صورت زیر عمل کرد:
foreach (Song song in songs)
{
    if (song.Lyrics is ["Hello", .., "?"])
    {
        Console.WriteLine(song.Name);
    }
}

به علاوه اگر در جستجویی دیگر، نیاز به کار با اعضای آرایه‌ی 5 عضوی یافت شده وجود داشت، می‌توان بدون نیاز به مراجعه‌ی متداول به ایندکس‌های آرایه، به صورت زیر عمل کرد:
foreach (Song song in songs)
{
  if (song.Lyrics is ["Hello", "from" or "is", var third, var forth, var fifth])
    {
      Console.WriteLine(song.Name);
      Console.WriteLine($"The third word is : {third}");
      Console.WriteLine($"The forth word is : {forth}");
      Console.WriteLine($"The fifth word is : {fifth}");
    }
}