ویژگی های دات نت 6
سریعترین و جدید ترین نسخه دات نت در حال حاضر نسخه 6 آن می باشد که دومین نسخه ای است که بعد از یکی شدن .Net core و .Net framework منتشر می شود. این نسخه سرشار است از بهبود های خوب در بخش کارایی و کم کردن هزینه نگهداری از سرویس هایی که با این نسخه ایجاد شده اند. یکی از نکات مهم در مورد این نسخه پشتیبانی طولانی مدت و 3 ساله تیم مایکروسافت از آن است و به همین دلیل به آن نسخه LTS می گویند.
به همراه .Net 6 نسخه جدید ویژوال استودیو یعنی Visual Studio 2022 و C# 10 نیز معرفی شدند. برای استفاده از این نسخه حتما باید از Visual Studio 2022 استفاده کنید.
Minimal APIs
در این نسخه به کمک قابلیت Top level که قبلا در مورد آن صحبت کردیم امکان پیاده سازی و ایجاد اپلیکیشن های فوق العاده کوچک به وجود آمد. وقتی از کوچکی یک اپلیکیشن در دنیای .Net صحبت میکنیم باید کدهای الان را با نسخه های قدیمی مقایسه کرد که برای راه اندازی یک سرویس کوچک چه کارهایی لازم بود انجام شود. برای ایجاد یک minimal api شما فقط لازم است در فایل program.cs کد های زیر را قرار دهید و تمام.
using Microsoft.AspNetCore.Builder;
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.MapGet("/hello", () => "Hello, World!");
app.Run();
File IO Improvements
سیستم FileStream در این نسخه به کلی بازنویسی شده و هدف این بازنویسی بهبود عملیات های خواندن و نوشتن نام همزان اعلام شده است. در این بازنویسی استفاده از حافظه به شدت بهینه شده است و این بهینه سازی برای تمامی پلتفرم ها ارائه شده است.کد زیر یک فایل 100 مگابایتی را درون یک فایل ذخیره می کند.
private byte[] _bytes = new byte[8_000];
[Benchmark]
public async Task Write100MBAsync()
{
using FileStream fs = new("file.txt", FileMode.Create, FileAccess.Write, FileShare.None, 1, FileOptions.Asynchronous);
for (int i = 0; i < 100_000_000 / 8_000; i++)
await fs.WriteAsync(_bytes);
}
که در جدول زیر می توان تست کارایی آن را با .Net 5 مقایسه کرد.
تولید کننده کد برای System.Text.Json
با افزودن تولید کننده کد برای System.Text.Json دیگر نیازی نیست تا در زمان اجرا از روش های پرهیزنه ای مثل reflection استفاده شود این قابلیت جدید به شما امکان این را می دهد که در زمان Build کدهای بهینه ای برای Serialization تولید کنید.
Global using directives
همه ما می دانیم که using ها و namespace ها چطوری کار می کنند. در.Net 6 امکان تعریف using ها به صورت Global اضافه شد به این صورت که شما در یک فایل .cs حتی program.cs می توانید از این قابلیت استفاده کنید و در تمامی فایل هایی که کامپایل می شوند به فایل هایی که درون این namespace هستند دسترسی داشته باشید. این قابلیت در پروژهای قدیمی به صورت یک انتخاب است و شما می توانید آن را فعال کنید اما در پروژه های جدید به صورت پیش فرض فعال است.
global using System;
global using static System.Console;
global using Env = System.Environment;
File-scoped namespaces
فضاهای نامی وابسته به فایل به شما این امکان را می دهند که فضا نامی را به کل فایلی که در آن هستید اختصاص دهید بدون اینکه نیاز داشته باشید از {} استفاده کنید.
namespace MyNamespace;
class MyClass { ... } // Not indented
Hot Reload
یکی از جذاب ترین قابلیت های این نسخه hot reload است. متوقف کردن و اجرای دوباره اپلیکیشن ها در حین توسعه برای نوشتن کدها و مشاهده نتیجه تغییرات همیشه اتفاقی بوده که در روز بارها و بارها آن را انجام داده ایم. گاهی برای یک تغییر کوچک انجام این عملیات غیر ضروری به نظر می رسد در نسخه جدید .Net با کمک قابلیت hot reload شما می توانید بدون متوقف کردن و اجرای دوباره برنامه نتیجه تغییرات کدهایتان را مشاهده نمایید.
پشتیبانی ازArm64
در مورد پشتیبانی .Net 6 از Arm64 در سیستم عامل های مک و ویندوز باید نکته های زیر را بدانید.
- .Net 6 از پردازنده های Arm64 و x64 پشتیبانی می کند و توصیه میکند از آنها استفاده کنیم.
- هچنین در runtime های .Net 6 نیز از پردازنده های Arm64 و x64 پشتیبانی می کنند.
- .Net core 3.1 و .Net 5 هم با این پردازنده ها کار می کنند اما از تمامی امکانات آنها پشتیبانی نمیکنند.
ثبت فونت دلخواه در Windows Forms
.Net 6 برای برنامه نویسان دسکتاپ نیز ویژگی های خوبی اضافه کرده که یکی از آنها تعریف فونت پیشفرض برای کل برنامه است. شما می توانید در این نسخه برای کل برنامه یک فونت دلخواه را تنظیم و ثبت کنید.
void Application.SetDefaultFont(Font font);
.NET MAUI
.Net MAUI یک ابزار چند سکویی برای ایجاد رابط های کاربری است که نسخه RC آن در فصل اول 2022 قرار است منتشر شود با کمک این ابزار می توان برای پلتفرم های ویندوز، آندروید و IOS رابط کاربری تولید کرد.
HTTP/3
در این نسخه شاهد پشتیبانی از HTTP/3 هستیم که هنوز به صورت کامل از جدید ترین نسخه HTTP پشتیبانی نمی شود. یکی از قابلیت های HTTP/3 اصطلاحا QUIC نام دارد که اتصالهای ایجاد شده از این نوع شده وابسته به IP نیستند و کلاینت های موبایلی را قادر می سازد تا بین اتصال های داده ای و Wifi ها رفت و آمد داشته باشند.
OpenTelemetry
در این نسخه از .Net بهبود های در پشتیبانی از OpenTelemetry انجام گرفته است. OpenTelemetry مجموعه ای از ابزار ها و سرویس هایی هستند که به شما کمک می کند رفتار و کارایی اپلیکیشن خو را تحلیل و بررسی کنید.
Generic math
این عملیات در مورد استفاده از عملگرهای محاسباتی روی نوع های جنریک می باشد. قبل از C# 10 نمی توانستید این کار را انجام بدهید اما با ویژگی به نام static abstract که در C# 10 preview وجود دارد می توان این عملیات ها را پیاده سازی کرد.
NuGet package validation
اگر شما یک توسعه دهنده پکیج هستید به کمک این ابزار ها می توانید از سالم بودن و منسجم بودن پکیج های خود اطمینان حاصل کنید.
PriorityQueue class
امکان تعریف لیست هایی که در آن اعضا به ترتیب اولویت و بر اساس منطق وارد و خارج می شوند. به این ترتیب که اعضای قدیمی تر زودتر از بقیه خارج می شوند.
امکانات جدیدMicrosoft.Extensions
در کتابخانه Microsoft.Extentions بهبود هایی در .Net 6 ایجاد شده است که در جدول زیر آنها را می بینیم.
Namespace | بهبود |
Microsoft.Extensions.DependencyInjection | به کمک CreateAsyncScope می توانید به صورت ایمن بلاک هایی تعریف کنید در آن از سرویس های IAsyncDisposable استفاده شده است. |
Microsoft.Extensions.Hosting | به کمک متد ConfigureHostOptions می توانید اپلیکیشن را به سادگی راه اندازی کنید. |
Microsoft.Extensions.Logging | این کتابخانه یک تولید کننده کد برای بهبود کارایی عملیات های لاگ زدن دارد. در زمان کامپایل این تولید کننده کد متد هایی را برای لاگ زدن ایجاد می کند که بسیار سریعتر از راه حل های زمان اجرا برای لاگ زدن هستند. |
امکانات جدید LINQ
متد های جدیدی به Linq در فضای نام System.Linq.Queryable اضافه شده است که در جدول زیر آنها را با هم بررسی میکنیم.
Enumerable.TryGetNonEnumeratedCount<TSource> (IEnumerable<TSource>, Int32) | تعداد اعضای درون یک لیست را بر میگرداند بدون اینکه مجبور باشد تک تک اعضا را بشمارد. |
Enumerable.Chunk<TSource> (IEnumerable<TSource>, Int32) | تقسیم کردن لیست به تعداد لیست های کوچکتر |
Enumerable.MaxBy و Enumerable.MinBy | پیدا کردن بزرگترین و کوچکترین عضوی که شرط ما را قبول کند. |
Enumerable.DistinctBy, Enumerable.ExceptBy, Enumerable.IntersectBy, و Enumerable.UnionBy | این تغییرات جدید که عملیات مبتنی بر مجموعه را انجام میدهند برای شما این امکان را فراهم می کنند که با استفاده از یک تابع انتخابگر، برابری را مشخص کنید. |
Enumerable.ElementAt<TSource> (IEnumerable<TSource>, Index) و Enumerable.ElementAtOrDefault<TSource> (IEnumerable<TSource>, Index) | یک ایندکس گرفته و مقدار آن را بر می گرداند. |
Enumerable.FirstOrDefault<TSource> (IEnumerable<TSource>, TSource), Enumerable.FirstOrDefault<TSource> (IEnumerable<TSource>,Func<TSource,Boolean>,TSource), Enumerable.LastOrDefault<TSource> (IEnumerable<TSource>,TSource), Enumerable.LastOrDefault<TSource> (IEnumerable<TSource>, Func<TSource,Boolean>, TSource), Enumerable.SingleOrDefault<TSource> (IEnumerable<TSource>, TSource) و Enumerable.SingleOrDefault<TSource> (IEnumerable<TSource>, Func<TSource,Boolean>, TSource) | اضافه شدن پیاده سازی های جدید که به شما اجازه می دهد مقدار پیش فرض را نیز تعیین کنید. |
Enumerable.Max<TSource>(IEnumerable<TSource>, IComparer<TSource>) و Enumerable.Min<TSource>(IEnumerable<TSource>, IComparer<TSource>) | پیاده سازی های جدید که به شما اجازه میدهد مقایسه گر مورد نظر خود را مشخص کنید. |
Enumerable.Take<TSource>(IEnumerable<TSource>, Range) | به عنوان ورودی یک بازه از شما دریافت می کند. و بازه مورد نظر را بر میگرداند. |
Enumerable.Zip<TFirst,TSecond,TThird> (IEnumerable<TFirst>, IEnumerable<TSecond>, IEnumerable<TThird>) | یک لیست از تاپل ها را برای شما از 3 مدل لیستی که به آن میدهید تولید میکند. |