امکانات جدید در .net 6 و C# 10

Posted by vahid on January 04, 2022

<div dir="auto">

چند وقت پیش بود که "رائول بنداری" دستش را روی دکمه ریلیز فشارداد و نسخه 6 فریم ورک دانت نت را همزمان با رویداد دات نت کانف منتشر کرد. ریلیزی که به خاطر حذف یک امکان و مختص کردنش به ویژوال استادیو خبر ساز شده بود و جامعه اوپن سورس را نگران کرده بود.


اما ببینیم تو دات نت 6 چه کارهایی انجام شده و امکاناتی که برای بهتر کد نوشتن اضافه شده چه مواردی هستند.


مهمترین کاری که در دات نت 6 انجام شده، اضافه شدن maui و فلانه اما ببینیم تو c# که در واقع زبان اصلی برنامه نویسی دات نت است چه اتفاقاتی افتاده.


برخی از تغییرات این نسخه از دات نت در زیر لیست شده که به مهمترین های اونها بیشتر می پردازیم.


* 1 Minimal API Framework

* 2 DateOnly and TimeOnly Types

* 3 LINQ OrDefault Enhancements

* 4 IEnumerable Chunk

* 5 SOCKS Proxy Support

* 6 MaxBy/MinBy

* 7 اضافه شدن record structs

* 8 بهبود structure typeها

* 9 دستکاری stringها با handler

* 10 global using

* 11 namespace در یک فایل بدون نیاز به آکولاد

* 12 الگوهای extended propery

* 13 بهبود عبارات لامبدا

* 14 دستکاری constantهخای از نوع رشته ای

* 15 تعریف و تخصیص در یک عبارت deconstruction

* 16 بهبود تخصیص مشخص

* 17 AsyncMethodBuilder بر روی متدها

* 18 callerArgumentExpression attribute diagnostics

* 19 بهبود پراگمای #line

* 20 Generic attributes

* 21 Priority Queue

* 22 file namespace



**1 Minimal API Framework**


مینیمال api شاید خیلی اتفاق خاصی نباشد چرا که فقط api زدن رو ساده تر و بدون کدهای اضافی کرده و شاید انگیزه اصلی آن رقابت با nodejs در سرعت ایجاد یک api و شوآف تعداد خط کد بوده، که البته نتیجه هم خوب، تمیز و ساده در آمده.

top levle programs در دات نت 5 معرفی شده بود که میتوانستیم فایل پروگرام را بدون نوشتن تابع Main و سایر مراسم معمول سی شارپ از جلمه فضای نام یک کنسول اپلیکیشن ساده بسازیم 

به چنین شکلی:

تصویر ساختار پروژه

و تصویر کد Main

همان مفهوم الان در دات نت 6 بیشتر توسعه داده شده

با این دستور یک پروژه وب میسازیم

اگر به کد ایجاد شده نگاهی بیندازیم، میبینیم که پروژه ساخته شده شامل چند فایل بیشتر نیست فایل csproj یک فایل apsettings.json و یک فایل program که با 4 خط کد یک ای پی آی را شکل میدهند و میتوانیم اچ تی تی پی رکوئست ارسال کرده  و پاسخ بگیریم. و خبری هم از تزریق وابستگی و تنظیمات نیست. که البته میتوان آن هار اضافه کرد ولی با همین چند خط یک وب اپلیکیشن داریم که کار میکند.


**2 DateOnly and TimeOnly Types**

اما این امکان، بسیار مفید است و میتواند کلی دردسرهای کار با datetime را رفع کند و از تنظیم کردن datetime بدون بخش time برای تاریخ هایی که فقط روز معنی دارد ما را نجات بدهد.

خیلی وقتها نیاز داشتیم فقط با یک تاریخ فارغ از ساعت(زمان) کار کنیم مثلن وقتی که با تاریخ تولد کار میکردیم. معمولن راه حل این بود که ساعت رو به نیمه شب یا ساعت صفر ست میکردیم. خود ما در فریم ورک شرکت  متدی را داشتیم به نام ..... که این کار رو برامون بکنه. ولی خوب مشکل مناطق زمانی هم بود که اگر به یک منطقه زمانی دیگر تبدیل میشد ممکن بود یک روز دیگر را نشان دهد در حالی که روز تولد را فارغ از زمان و محل میدونیم یعنی اگر شما تاریخ تولدتون 5فروردین هست آمریکا هم که بروید تاریخ تولدتان همان 5 فروردین می ماند. این با وجودی بود که اکثر دیتابیس ها تاریخ خالی هم داشتند مثلن اس کیو ال سرور تایپ Date را علاوه بر datetime، date و time هم دارد که خوب همگی در سی شارپ به دیت تایم نگاشت میشدند که حالا با معرفی این دو تایپ دیگر نیازی به این کار نخواهد بود.

این موضوع در مورد تایم دردسر بیشتری داشت مثلن فرض کنید میخواستیم تایم تسکی که هر روز سر یک ساعت خاص قراراست اجرا شود را ذخیره کنیم که البته تا الان از تایم اسپن استفاده میکردیم ولی تایم اسپن هم طراحی شده برای زمان سپری شده نه اینکه برای نگه داشتن یک ساعت خاص باشد مثلن تایم اسپن میتواند ساعتش 25 باشد. مشکل دیگر هم وقتی بود که مثلن رویدادی ساعت 11 شب شروع میشد و 2ساعت ادامه داشت و پس از آن ساعت باید یک صبح می‌شد.

dateonly شامل منطقه زمانی نیست و مشکلی که در مورد تولد گفتیم پیش نمی آید.

این خیلی کار با ساعت و تاریخ را ساده تر میکند مثلن isbetween


**3 LINQ OrDefault Enhancements**

با این امکان میتونیم بخش orDefault رو تحت کنترل داشته باشیم و تعیین کنیم که default  چی باشه غیر از دیفالت تعریف شده خود تایپ ها.

**4 IEnumerable Chunk**

این هم چانک کردن یا قسمت کردن یک IEnumerable رو ساده تر میکنه.

و به جای استفاده از skipو take میتونیم از chunk استفاده کنیم که تمیزتر بشه کدمون و چیز خاص دیگه ای نداره.

**5 SOCKS Proxy Support**

استفاده از پراکسی ها برای ما که تو ایران هستیم جدا از استفاده از اینترنت نیست. یکی از پروتکل های پراکسی هم ساکس هست که تا حالا دات نت ازش پشتیبانی نمیکرده ولی تو این ورژن اضافه شده و میتونیم اینطوری ازش استفاده کنیم و خیلی فرق خاصی با مثلن httpsproxy که قبلن استفاده میکردیم نداره.

**6 MaxBy/MinBy**

این قابلیت رو میده که ماکسیمم یا مینیم روی یک ویژگی رو پیدا کنیم و لی خود آبجکت رو ریترن کنیم که خوب تمیز تر از سورت کردن و بعد فرست یا لست گرفتن هست.


**7 Record Structs**


خیلی پر استفاده نیست ولی خوب طبیعتن وقتی برای کلاس اینو داشتیم برای استراکت هم باید بتونیم استفاده کنیم که در واقع فقط بتونیم با with استراکت ها رو هم استفاده کنیم


**8 بهبود structure typeها**

**9 دستکاری stringها با handler**

**10 global using**


دستورات using یه سری دستورات بی آزار بالای هر فایل کد C# هستن که کاری بهشون نداریم و اسکرول میکنیم تا برسیم به کلاس و فقط وقتی بهشون توجه میکنیم که کلی با یک باگ ور میریم بعد میفهمیم که وقتی کنترل دات زدیم نیم اسپیس اشتباه رو انتخاب کردیم مثلن به جای اینکه File از نیم اسپیس system.io اضافه کرده باشیم فایل از نیم اسپیس microstoft.aspnet.http اضافه کردیم و متدایی که دنبالشیم نداره. که گاهی وقتی پیش میاد ولی با گلوبال نیم اسپیس اون نیم اسپیسایی که همه جا هستنو دیگه میتونیم ننویسیم مثل system و فلان اضافی هم باشن مشکلی برای کسی پیش نمیاد.

**11 namespace 

در یک فایل بدون نیاز به آکولاد


**12 الگوهای extended propery**

**13 **بهبود عبارات لامبدا

**14 دستکاری constantهای از نوع رشته ای

*15 تعریف و تخصیص در یک عبارت deconstruction

*16 بهبود تخصیص مشخص

*17 AsyncMethodBuilder بر روی متدها

*18 callerArgumentExpression attribute diagnostics

**نیم اسپیس فایل22 **


خوب گویا دوستان در مایکروسافت به این نتیجه رسیدن که نیم اسپیس یه لول ایندتیشن اضافی رو موجب میشه که هر فایلیو میخوای نگاه کنیم هیچ وقت از سر خط شروع نمیشه پس چه کاریه یه نیم اسپیس بنویسیم و ببندیمش همون اول و تکلیف کل فایل رو مشخص کنیم معمولنم که شروعش اول فایله و پایانش آخر فایل درستم فکر کردن دستشونم درد نکنه 


حالا به جای این 


میتونیم بنویسیم این



**19 بهبود پراگامای #line**

این هم خیلی به کار ما نمیاد ولی خوب باعث شده دیباگ بهتری رو تجربه کنیم


**20 Generic attributes**

این هم آپشن خوبیه که میتونیم attributeهارو به صورت generic تعریف کنیم


**21 Priority Queue**

صف رو مدت هاست در دات نت داشتیم و میدونیم که صف یعنی هرکی اول اومد اول هم خارج میشه FIFO و استک هم که LIFO هست هرکی آخر اومد اول خارج میشه اما صف اولویت یعنی اینکه مهم نیست کی اومده اونی که اولویت بالاتری داره اول خارج میشه. شاید بتونیم بگیم

whoever comes whenever priority matters که میشه

WCWPM که اختصاری خوبی در نمیاد پس چیزی نمیگیم بهش 

یا 

whatever in, highest priority out

که میشه wihpo

اولویت هم معمولن این طور تعریف میشه که عدد کمتر یعنی اولویت بالاتر 0 بالاترین اولویت. البته میشه اولویت هر جور دیگه تعریف کرد و یه IComparer برای مقایسه پیاده سازی کرد. که مثلن برای سناریوی پیمایش گراف و هزینه مسیر به عنوان اولویت میتونه باشه که بر اساس پرهزینه و کم هزینه پیمایش انجام بشه.

</div>


آموزش مقدماتی پایتون 10 آموزش مقدماتی پایتون 9 آموزش مقدماتی پایتون 8