اشتراکها
داتنت ۹ نسخه RC1 منتشر شد
اشتراکها
وبینار آشنایی با داتنت ۵ و سیشارپ۹
اشتراکها
بهبودهای کارآیی LINQ در داتنت 9
.NET 9.0 LINQ Performance Improvements
With .NET 9, LINQ becomes faster in several common scenarios. As with every new version of .NET, you simply need to migrate and recompile to take advantage of these improvements. Additionally, LINQ has been optimized in other ways: SIMD is utilized whenever possible, such as when summing a sequence of integers. Moreover, enumerating empty sequences incurs lower costs due to early detection.
مطالب
C# 7.1 - async Main
پس از فعالسازی C# 7.1، اولین ویژگی جدید C# 7.1، متدهای Main برنامههای کنسول (و همچنین WPF و WinForms) هستند که اینبار قابلیت تعریف async را نیز دارند.
نحوهی کار با متدهای async، در متدهای Main نگارشهای پیش از C# 7.1
برای کار با متدهای Async نیاز است از واژهی کلیدی await استفاده شود و با قید این واژه، ضروری است واژهی کلیدی async نیز به امضای متد دربرگیرندهی عملیات اضافه گردد؛ اما در نگارشهای پیشین زبان #C، امکان async تعریف کردن متد Main وجود نداشت. در این حالت میبایستی به صورت ذیل عمل میشد:
در این حالت برای کار با متد ReadToEndAsync ابتدا نیاز است جهت استفادهی از واژهی کلیدی async، این متد را در یک متد دربرگیرندهی مجزا تعریف کرد تا بتوان تعاریف متداول اعمال غیرهمزمان را به آن متد، که حساسیتی بر روی امضای آن وجود ندارد، اضافه کرد؛ مانند متد MainAsync فوق. سپس میتوان این متد را به همراه GetAwaiter().GetResult در متد Main اصلی فراخوانی کرد.
نحوهی کار با متدهای async در متدهای Main برنامههای مبتنی بر C# 7.1
در زبان سیشارپ، متدهای Main برنامههای کنسول میتوانند خروجیهایی از نوع void و int داشته باشند؛ به همراه آرگومانی از نوع []string و یا بدون آرگومان. اکنون در سیشارپ 7.1، دو امضای دیگر نیز به این مجموعه، جهت کار با اعمال Async اضافه شدهاست: async Task و یا <async Task<int
در این حالت مثال قبل را میتوان به صورت ذیل خلاصه کرد:
اولین تغییر، افزودن نوع خروجی async Task به متد Main است. سپس دیگر نیازی به تعریف یک متد دربرگیرندهی دیگر جهت اعمال این امضاء وجود ندارد و میتوان محتوای متد کمکی MainAsync را مستقیما درون متد Main ذکر کرد.
نگاهی به پشت صحنهی کامپایل async Task Main در C# 7.1
در عمل، کامپایلر سیشارپ جهت حفظ سازگاری با نگارشهای قبلی، مجددا همان متد static void Main را تولید میکند و عملیاتی را که در مورد نگارشهای پیشین توضیح داده شد، تکرار خواهد کرد:
همانطور که مشاهده میکنید، در اینجا نیز متد Main اصلی همان static void قدیمی است و محتوای داخل متد Main را به یک متد کمکی دربرگیرنده منتقل کرده و در نهایت GetAwaiter().GetResult را بر روی این متد فراخوانی کردهاست.
در یک برنامهی سیشارپ میتوان بیش از یک متد Main داشت
تعریف بیش از یک متد Main در برنامههای سیشارپ مجاز است:
در این حالت تنها کافی است به خواص پروژه مراجعه کرده و متد Main آغازگر را انتخاب کرد:
اما ... اگر دقت کنید، متد async Task Main در اینجا ایندکس نشدهاست که به نظر کمبود نگارش فعلی VS 2017 است.
نحوهی کار با متدهای async، در متدهای Main نگارشهای پیش از C# 7.1
برای کار با متدهای Async نیاز است از واژهی کلیدی await استفاده شود و با قید این واژه، ضروری است واژهی کلیدی async نیز به امضای متد دربرگیرندهی عملیات اضافه گردد؛ اما در نگارشهای پیشین زبان #C، امکان async تعریف کردن متد Main وجود نداشت. در این حالت میبایستی به صورت ذیل عمل میشد:
static void Main(string[] args) { MainAsync().GetAwaiter().GetResult(); Console.ReadLine(); } private static async Task MainAsync() { using (StreamReader reader = File.OpenText("Program.cs")) { var message = await reader.ReadToEndAsync().ConfigureAwait(false); Console.Write(message); } }
نحوهی کار با متدهای async در متدهای Main برنامههای مبتنی بر C# 7.1
در زبان سیشارپ، متدهای Main برنامههای کنسول میتوانند خروجیهایی از نوع void و int داشته باشند؛ به همراه آرگومانی از نوع []string و یا بدون آرگومان. اکنون در سیشارپ 7.1، دو امضای دیگر نیز به این مجموعه، جهت کار با اعمال Async اضافه شدهاست: async Task و یا <async Task<int
در این حالت مثال قبل را میتوان به صورت ذیل خلاصه کرد:
static async Task Main(string[] args) { using (StreamReader reader = File.OpenText("Program.cs")) { var message = await reader.ReadToEndAsync().ConfigureAwait(false); Console.Write(message); } Console.ReadLine(); }
نگاهی به پشت صحنهی کامپایل async Task Main در C# 7.1
در عمل، کامپایلر سیشارپ جهت حفظ سازگاری با نگارشهای قبلی، مجددا همان متد static void Main را تولید میکند و عملیاتی را که در مورد نگارشهای پیشین توضیح داده شد، تکرار خواهد کرد:
using System; using System.IO; using System.Runtime.CompilerServices; using System.Threading.Tasks; namespace ConsoleCS71 { internal class Program { private static async Task Main(string[] args) { StreamReader reader = File.OpenText("message.txt"); try { string str = await reader.ReadToEndAsync(); string message = str; str = (string)null; Console.Write(message); message = (string)null; } finally { if (reader != null) reader.Dispose(); } reader = (StreamReader)null; Console.ReadLine(); } [SpecialName] private static void <Main>(string[] args) { Program.Main(args).GetAwaiter().GetResult(); } } }
در یک برنامهی سیشارپ میتوان بیش از یک متد Main داشت
تعریف بیش از یک متد Main در برنامههای سیشارپ مجاز است:
namespace ConsoleApp5 { class Class1 { static void Main(string[] args) { } } class Class2 { static void Main(string[] args) { } } }
اما ... اگر دقت کنید، متد async Task Main در اینجا ایندکس نشدهاست که به نظر کمبود نگارش فعلی VS 2017 است.