امکانات جدید سی شارپ در نسخه های 6، 7، 8 و 9 برای پیرمردها - بخش اول

برای دیدن ویدیوهای من در مورد برنامه نویسی عضو این کانال شوید :https://t.me/mediapub_channelده یازده سالی میشه که با سی شارپ کار می‌کنم و به نوعی درگیر روزمرگی شدم. خیلی از پیرمردهای بی‌حالی مثل من شاید به دلیل مشغله و درگیری با پروژه های مختلف و نگرانی از موعد تحویل، فقط کد زده باشند و دو سه نسخه از سی شارپ عقب افتاده باشند. من خودم از نسخه های 8 و 9 عقب افتادم و کدهام به روز نیست. قصد دارم توی دو مقاله بدون اضافه گویی، مروری بر چهار نسخه اخیر سی شارپ داشته باشم.بنظرم خوندن این مقاله اهمیت داره، چون سی شارپ داره به سمتی میره که یکی دو سال دیگه، کدها به شکل عجیبی متفاوت با آنچه در این سال ها انجام دادیم خواهند شد. شاید دیگر کدهای جوانترها را نفهمیم!حرف های اضافی تموم شد! بریم سراغ اصل مطلب. امیدوارم به درد شما بخورد.امکانات جدید سی شارپ در نسخه های 6، 7، 8 و 9 برای پیرمردها - بخش اول (همین مقاله)امکانات جدید سی شارپ در نسخه های 6، 7، 8 و 9 برای پیرمردها - بخش دوم و آخرتوضیحات این دو مقاله را در یک ویدیو ببینید : https://youtu.be/xBfLKe2D32Q سی شارپ 6پراپرتی های صرفا دهنده (Getter-Only auto-property) و initialize کردن https://gist.github.com/07e91a3ff331b1dc93a41f4d1e5fb7b9 قبلا برای پراپرتی هایی که فقط قابلیت خواندن داشتند از کلیدواژه readonly استفاده میکردیم، همچنین برای مقدار اولیه دادن به آنها مجبور بودیم در کانستراکتور مقدار دهیم. اما کد بالا حالت بهینه آن در سی شارپ 6 به بعد است. قبلا به شکل زیر بود.public class User { public string Name { get; set; } // UserCreationTime is immutable private readonly DateTime _creationTime; public DateTime CreationTime { get { return _creationTime; } } public User(string name) { Name = name; _creationTime = DateTime.Now; } }یوزینگ برای کلاس های استاتیک (using for static class)به جای تکرار کلاس های استاتیک (مثل Math) همان بالا وقتی یوزینگ میکنیم مینویسیم using System.Mathویژگی String Interpolationمثال مایکروسافت را ببینید. https://gist.github.com/d3b4c2b4b61dff6c72ee248da595d988 نیاز به توضیح نیست و مثال فوق گویاست. روش اول برای جاگذاری متغیر ها در یک متن، composing formatting است و روش دوم string interpolation.ویژگی Expression-bodied methods و Expression-bodied propertyاین ویژگی در سی شارپ 6 اضافه شد و در نسخه 7 تکمیل شد. در بخش مربوط به سی شارپ 7 کامل توضیح خواهم داد. بطور خلاصه اصلاح شکل نوشتن متدهاست. مثال زیر را ببین. https://gist.github.com/2b55b3de3d839ac96e25712239b858cb به شکل نوشته شدن دو متد ToStringو DisplayName نگاه کنید. استفاده از فلش لامبدایی (Lambda arrow ) در زبان های برنامه نویسی باب شده است.برای پراپرتی ها هم قابل استفاده است.ویژگی Index initializersچطور یک دیکشنری میسازیم؟ به یاد دارید؟ برای اولیه سازی ایندکس ها روش تازه و ساده ای در سی شارپ 6 قرار داده شده. کد زیر را ببینید: https://gist.github.com/1961502213c29d259bab96fd03c0f70f ویژگی null-conditional operatorsچک کردن نال نیز در سی شارپ 6 ساده شده. به مثال های زیر نگاه کنید. https://gist.github.com/1092d1ef3e66ab2df0fc2f72a1c9d1e5 معمولا در رابطه با کدهای فوق پیش از این با خطاهای زیادی حین توسعه رو به رو میشدیم. مثلا یادمان میرفت people را بررسی کنیم که نال نباشد. با این ویژگی اگر people نال بود پراپرتی Length آن بررسی نمیشود و مقدار null به length نسبت داده میشود.یا برای آرایه people هم اگر آیتم [0] وجود نداشته باشد به مشکل نمیخوریم چون حضور «؟» مشکلات را حل میکند.به «.?» اپراتور «الویس» میگویند. (Elvis operator)به علامت سوال به همراه نقطه یا دو نقطه اپراتور الویس میگویند.قابلیت Exception filterمیتوانید برای کنترل خطاها و دستیابی به انواع اکسپشن هایی که تولید میکنید از when استفاده کنید. https://gist.github.com/9b5f6873806557281b2e6654c2fe1fba مثلا برای لاگ کردن خطا روش زیر جالب است: https://gist.github.com/defedddfc09f1ead298f639ab6038a42 سی شارپ 7تحول در Tuple هابزرگترین اتفاق در سی شارپ 7 کار روی Tuple ها بود که به شکل فوق العاده ای بهینه و کار راه انداز شدند. تا پیش از این، Tuple توسعه را سریع و کد را کثیف و ناخوانا و پیچیده میکرد ولی در نسخه 7 اصلاحاتی انجام شد که Tuple یکی از بهترین گزینه های پیش روی توسعه دهنده ها شد.توضیح خلاصه اینکه معمولا اگر یک فانکشن دو خروجی مختلف داشته باشد ما از تایپ استفاده میکنیم. یعنی یک ساختار (کلاس یا هر چی) میسازیم که دو پراپرتی داشته باشد و خروجی را با همان جنس Return میکنیم. اما مشکلی که وجود دارد این است که گاهی زحمت ما برای ایجاد تایپ (مثلا درست کردن یک کلاس) فقط در یک متد استفاده میشود. در این موارد چرا باید اینکار را بکنیم وقتی Tuple به راحتی از عهده اینکار بر می آید؟ پیرمردها الکی مقاومت نکنند. https://gist.github.com/44a9319fa6fc05f1de88d24c6091db54 در مثال فوق فانکشنی برای محاسبه مینیمم و ماکزیمم مقدار موجود در یک آرایه نوشتیم که خروجی آن یک تاپل است. تاپلی که هر آیتم آن «نام» دارد، min و max . پیش از این ورژن، تاپل ها بی اسم بودند و با item1 و item2 و ... مشخص میشدند. به طرز استفاده از این فانکشن هم دقت کنید.ویژگی local functionمیتوانیم درون یک فانکشن، یک فانکشن لوکال دیگر تعریف کنیم.این فانکشن به تمام متغیرهای موجود در اسکوپ فانکشن اصلی دسترسی دارد و خودش تنها در همین اسکوپ قابل استفاده است. https://gist.github.com/f48445053788ac6bb788b05f312db15a ویژگی Pattern matchingنوع جدیدی از ساختارها در سی شارپ هستند که در نسخه 8 و 9 به بلوغ رسیدند. میتوانیم فعلا آنها را به دو دسته is Pattern و case Pattern تقسیم کنیم. البته در مقالات مختلف تقسیم بندی های متفاوت وجود دارد.if (input is int count && count > 100)کد فوق اولا تایپ متغیر input را چک میکند و سپس مقدار آن را برای بزرگتر از 100 بودن بررسی میکند. دقت کنید وقتی متغیر input چک شد و int بود، از این به بعد متغیر count است که مقدار input را در خود نگه میدارد.این الگو برای بررسی null بودن هم کاربرد دارد.if (input is null)به سوئیچ زیر نگاه کنید. همان pattern matching را در case انجام دادیم.switch (i) { case int n when n > 100: ... case Car c: ... case null: ... case var j when (j.Equals(10)): ... default: ... }قشنگی کار اینجاست که در سوئیچ کلاسیک ما فقط برابری مقادیر را بررسی میکردیم ولی همانطور که میبینید به کمک واژه when بررسی کردیم که مقدار i از 100 بزرگتر است یا نه. سپس بررسی کردیم که آیا جنسش از نوع Car است. سپس null بودن را بررسی کردیم و در نهایت هم بدون اینکه تایپ را چک کنیم(از var استفاده کردیم) برابری مقدارش را با 10 بررسی کردیم. (دقت کنید که j میتواند نال باشد برای همین case null را قبل از case var نوشتیم).نوع دیگر دسته بندی در pattern matching به شکل زیر است:الگوی constant : آیا مقدار نال است؟if ( o is null) return;الگوی تایپی : آیا مقدار از تایپ خاصی است؟if ( ! ( o is int i) ) returnl;مثال زیر را ببینید : https://gist.github.com/mortezadalil/475c80891a27ae37da4c61dbacd1dc4c سوئیچ فوق را ببینید. همه کاری میکند.هیچوقت سی شارپ اینقدر قدرتمند نبوده!بنظر من با سی شارپ هفت، با ظهور تاپل های خوش‌ساخت و pattern matching ، دنیا بسیار بهتر شد و حداقل نوید این داده شد که نسخه های بعدی هیجان انگیزتر خواهند شد.منبع : ویدیوهای Mads Torgersen در یوتیوب + مقاله های مرتبط با تغییرات سی شارپ 6 و 7