روش سنتی بررسی نال بودن اشیاء و متغیرها در زبان #C، استفاده از اپراتور == است: if(person == null) { }
اما از زمان C# 7.0 و معرفی pattern matching، از واژهی کلیدی is نیز میتوان برای اینکار استفاده کرد (که به آن constant pattern هم میگویند): if(person is null) { }
اکنون سؤال اینجا است که امروز بهتر است از کدامیک استفاده کنیم؟ سربارگذاری عملگرها و مقایسهی وهلههای اشیاء با null
در عمل، تفاوتی بین اس ...
از زمانیکه کامپایلر #C، تحت عنوان Roslyn بازنویسی شد، قابلیت افزونهپذیری نیز پیدا کرد. برای مثال میتوان آنالیز کنندهای را طراحی کرد که در پروسهی کامپایل متداول کدهای #C مورد استفاده قرار گرفته و خطاها و یا اخطارهایی را صادر کند که جزئی از پیامهای استاندارد کامپایلر #C نیستند. در این مطلب نحوهی معرفی آنها را به پروژههای جدید NET 5.0.، بررسی میکنیم.
معرفی تعدادی آنالیز کنندهی کد که به عنوان افزونهی کامپایلر #C قابل ا ...
یکی
از ویژگیهای جدید اضافه شده به سی شارپ 9، Attributes on
local functions نام دارد و این توانایی را به ما میدهد تا بر روی متدهای محلی که
درون متدها تعریف میشوند، Attributes قرار دهیم. قابلیت local functions در نسخه 7 سی شارپ اضافه شدهاست و با استفاده از این قابلیت میتوانیم درون یک متد، تابع دیگری را تعریف کنیم و در همان متد، از آن تابع درونی
استفاده کنیم. در واقع تاب ...
یکی از مواردی را که در حین ارتقاء پروژههای خود به NET 5.0. و C# 9.0 احتمالا مشاهده خواهید کرد، گزارش خطاهای کامپایلری است که پیشتر با نگارشهای قبلی #C و NET Core.، اصلا خطا نبوده و بدون مشکل کامپایل میشدند. یعنی کدی که با NET Core SDK 3x. بدون مشکل کامپایل میشود، الزامی ندارد که با NET 5.0 SDK. نیز کامپایل شود. در این مطلب، تغییرات صورت گرفتهی در تنظیمات کامپایلر #C را در NET 5.0 SDK.، بررسی میکنیم. معرفی AnalysisLevel در کامپ ...
عبارت foreach در زبان #C، امکان پیمایش اعضای یک مجموعه را میسر میکند؛ اما نه هر مجموعهای. این مجموعهی خاص باید به این صورت تعریف شده باشد: الف) <IEnumerable<T را پیاده سازی کرده باشد. ب) و یا ... مهم نیست که این مجموعه حتما <IEnumerable<T را پیاده سازی کرده باشد. اگر این مجموعه به همراه یک متد عمومی خاص با نام GetEnumerator باشد که خروجی آن دارای خاصیت عمومی T Current است (یکی از اعضای اینترفیس <IEnumerable<T ...
C# 9.0 به همراه دو بهبود جزئی دربارهی کار با Lambdas است:
- امکان عدم ذکر بعضی از پارامترهای Lambdas
- امکان تعریف متدهای static anonymous امکان عدم ذکر بعضی از پارامترهای Lambdas در C# 9.0
مثال زیر را در نظر بگیرید: Action<object, EventArgs> handler1 = (object obj, EventArgs args) => ShowDialog();
در عبارت lambda تعریف شده، از پارامترهای obj و args استفاده نشدهاست. به همین جهت برای ...
C# 9.0 به همراه قابلیت جدیدی است به نام «module initializer» که در اصل متدی است که در زمان بارگذاری اولیهی یک اسمبلی، به صورت خودکار اجرا میشود. عملکرد آن شبیه به سازندههای static کلاسها است؛ اما بجای اعمال به یک کلاس، اینبار به کل اسمبلی اعمال میشود. این قابلیت از روزهای ابتدایی طراحی CLR وجود خارجی داشته، اما در C# 9.0، امکان استفادهی عمومی از آن فراهم شدهاست.
روش تعریف یک module initializer
در مثال زی ...
در زبان #C، زمانیکه از کلاسی ارثبری میشود، امکان بازنویسی متدهای کلاس پایه، در صورت معرفی آنها به صورت virtual و یا abstract، وجود دارد؛ اما در این بازنویسیها، تغییر نوع خروجی این متدها مجاز نیست. این محدودیت در C# 9.0 با معرفی Covariant returns برداشته شدهاست؛ با یک شرط: نوع جدید این خروجی، باید covariant نوع اصلی متدی باشد که از کلاس پایهی آن ارثبری شدهاست.
وضعیت خروجی متدهای بازنویسی شده تا پیش از C# 9.0
...
یکی از ویژگیهای زبان VB، شباهت بیش از اندازهی آن به زبان انگلیسی است. برای مثال در این زبان با استفاده از not و and: If Not a And b Then
...
Else
...
EndIf
میتوان ifهای خواناتری را نسبت به #C ایجاد کرد: if(!(a) && b)
{
...
}
else
{
}
در ادامه خواهیم دید که چگونه C# 9.0، این آرزوی دیرین را برآورده میکند! البته مایکروسافت در جای دیگری هم عنوان کردهاست که زبان VB را دیگر پیگیری نمیکند ...
در مطلب معرفی خواص init-only ، با روش معرفی خواص immutable آشنا شدیم. نوع جدیدی که به C# 9.0 به نام record اضافه شدهاست، قسمتی از آن بر اساس همان خواص init-only کار میکند. به همین جهت مطالعهی آن مطلب، پیش از ادامهی بحث جاری، ضروری است.
چرا در C# 9.0 تا این اندازه بر روی سادگی ایجاد اشیاء Immutable تمرکز شدهاست؟
به شیءای Immutable گفته میشود که پس از وهله سازی ابتدایی آن، وضعیت آن دیگر قابل تغییر نباشد. همچنی ...