در مطلب « C# 7 - Tuple return types and deconstruction » با نوعهای جدید بازگشتی Tuple در C# 7.0 آشنا شدیم. در C# 7.1 تشخیص نام اعضای Tuple تعریف شده بهبود یافته و از این لحاظ شبیه به anonymous types شدهاست. مفهوم «Name Inference» یا «حدس زدن نامها» را با یک مثال بهتر میتوان توضیح داد. string name = "User 1";
int age = 20;
var personTuple = (name, age);
Console.WriteLine(personTuple.Item1); // User 1
Console.WriteLine(person ...
Literal چیزی است مانند null و در حقیقت یک واژهی کلیدیاست که دارای مقداری مشخص میباشد. واژه کلیدی default نیز مفهوم مشابهی را به همراه دارد. تا پیش از C# 7.1 برای دسترسی به مقدار پیشفرض value types به صورت ذیل عمل میشد: int a = default(int);
در اینجا مقدار پیشفرض نوعی که بین پرانتزها ذکر میشود، بازگشت داده خواهد شد. اگر int ذکر شود، صفر و اگر bool ذکر شود، مقدار fa ...
پس از فعالسازی C# 7.1 ، اولین ویژگی جدید C# 7.1، متدهای Main برنامههای کنسول (و همچنین WPF و WinForms) هستند که اینبار قابلیت تعریف async را نیز دارند.
نحوهی کار با متدهای async، در متدهای Main نگارشهای پیش از C# 7.1
برای کار با متدهای Async نیاز است از واژهی کلیدی await استفاده شود و با قید این واژه، ضروری است واژهی کلیدی async نیز به امضای متد دربرگیرندهی عملیات اضافه گردد؛ اما در نگارشهای پیشین زبان #C ...
C# 7.1 به همراه به روز رسانی سوم VS 2017 ارائه شدهاست و اگر در ابتدای کار سعی کنید برای مثال یکی از ویژگیهای جدید C# 7.1، مانند static async Task Main را توسط آن آزمایش کنید، خطای کامپایل برنامه را دریافت میکنید. علت اینجا است که این نگارش خاص حتما نیاز به تنظیمات ویژهای را جهت فعالسازی دارد.
فعالسازی کامپایلر C# 7.1 در VS 2017
ابتدا مسیر Visual Studio -> Build tab -> Advanced را طی کنید:
...
ASP.NET Core با ذهنیت پشتیبانی و استفاده از تزریق وابستگیها ایجاد شدهاست. اپلیکیشنهای ASP.NET Core از سرویسهای ذاتی فریم ورک که داخل متدهای کلاس Startup پروژه تزریق شدهاند و همچنین سرویسهای اپلیکیشن که تنظیمات خاص آنها در پروژه انجام گرفته است، استفاده میکنند. سرویس کانتینر پیش فرض ارائه شده توسط ASP.NET Core، مجموعهای حداقلی از ویژگیها را ارائه میکند و هدف آن جایگزینی با دیگر فریم ورکهای تزریق وابستگی نمیباشد. مشاهده یا دا ...
در تکمیل سری بررسی ویژگیهای C# 7.0 ، ذکر ویژگی Discards نیز ضروری است. Discards به معنای متغیرهای محلی هستند که قابل انتساب بوده، اما قابل خواندن نیستند. دارای نامی نیستند و تنها توسط یک _ مشخص میشوند. در اینجا underscore یا _، یک واژهی کلیدی است؛ مانند var و قابلیت خوانده شدن را ندارد (نمیتواند در سمت راست یک انتساب قرار گیرد).
علت وجود Discards در C# 7.0
گاهی از اوقات میخواهیم از مقادیر بازگشت داده شدهی تو ...
مهمترین دستاورد الگوی شیء نال ( Null Object Pattern ) این است که جریان کنترل (branch ) برای شاخه مثبت و منفی یکسان است و هیچگونه انشعاب شرطی بر اساس آزمونهای null وجود ندارد. شیءهای حقیقی دارای یک سری از رفتارها هستند؛ ولی Null Object معمولا هیچ کاری را انجام نمیدهد. Null Object دارای هیچگونه اطلاعاتی نیست. اگر ما یک برنامه تجارت داشتیم که در آن درخواست خرید، Null Object را برگرداند، در واقع تمام سر نخهایی را که چرا عملیات با ...
یکی از پیچیدگیهای معمول در کد، کلاسی است که دارای مجموعهای باشد. مشکل اصلی با چنین طراحی این است که تمام عملیات باید از وضعیت مجموعه آگاه باشند. چرا مجموعهها خیلی پیچیده هستند؟ داشتن مجموعه، خود با بسیاری از سوالات همراه است. آیا مجموعه حاوی اشیایی است یا خالی است؟ برخی از توابع تجمعی را نمیتوان در مجموعههای خالی محاسبه کرد. به عنوان مثال Maximum در یک مجموعه خالی تعریف نشده است. بعضی دیگر از توابع تجمعی به این مشکل اهمیت نمیدهند، ما ...
الگوی Service Locator، به صورت گستردهای به عنوان یک ضد الگو شناخته میشود و هنگامیکه از این الگو استفاده میکنیم ما را با یک سری از مشکلات رو به رو میکند. ولی این الگوی طراحی به خودی خود منشاء مشکل نیست. مشکل اصلی این الگو نحوه استفاده از آن است که در این مقاله درباره آن بحث میکنیم. مشکل اصلی الگوی Service Locator زمانیکه یک کلاس، وابسته به یک Service Locator است، آن تمام وابستگیهای واقعی کلاس را مخفی میکند. ما ن ...
DebuggerStepThroughAttribute ویژگی DebuggerStepThroughAttribute باعث میشود که در زمان دیباگ کردن کد، با کلید F11، متدهایی که این ویژگی را دارند، بدون رفتن به داخل متد (همانند دیباگ با کلید F10 عمل میکند، به جز زمانی که در داخل متد break point گذاشته باشید) ، تنها اجرا میشوند. به مثال زیر توجه کنید: class Program
{
public static void Main(string[] args)
{
DebuggerStep ...