مدتی است که وقتی در سایتهای مربوط به داتنت میگردیم، از گمانهزنیهای مختلف در مورد امکانات C# 10 زیاد میشنویم. اگر وارد C# GitHub Page شویم، امکاناتی را میبینیم که ممکن است به این ورژن برسند، در ورژنهای بعدی اضافه خواهند شد یا رد (Reject) شدهاند. ولی اگر بخواهیم بدانیم دقیقا چه امکاناتی به C# 10 اضافه خواهد شد، باید تا نوامبر ۲۰۲۱ صبر کنیم که با ارائه آخرین نسخه .NET 6 شاهد امکانات جدید C# 10 باشیم.
یک میانبر دیگر هم برای فهمیدن ویژگیهای جدید وجود دارد و آن دنبال کردن افراد مهم و کلیدی در تیم C# است!
چندی پیش در کنفرانس Microsoft’s Build مدیر طراحی (Lead Designer) زبان C# تعدادی از امکانات قطعی که با C# 10 خواهیم دید، را رونمایی کرد. ما هم در این مقاله ۴ مورد از آن امکانات را مطرح میکنیم که شاید برای شما جالب و کاربردی باشد.
ویژگیهای جالب ۱۰ #C
در ادامه تعدادی از این ویژگیها را با هم بررسی خواهیم کرد:
Global Using در C# 10
بعضی وقتها یک سری کدها را مدت زیادی میبینیم، به آنها عادت میکنیم و فکر میکنیم که « همینی که هست، بهترینه». اما گاهی تغییراتی در این کدها انجام میشود و یک دفعه متوجه میشوید که خیلی جالب است! چرا تا به حال به این روش فکر نشده بود!؟
به طور مثال در C# 10 یک تغییر در تعریف using های بالای کلاسها صورت گرفته است که میتواند، کلاسها را خلوتتر و تمیزتر کند. به این صورت که using هایی که به صورت Global بوده و در بیشتر کلاسها مشترک است مانند using System; در یک فایل دیگر به صورت Global تعریف میکنیم تا دیگر نیازی نباشد که مدام در کلاسهای مختلف این using را ببینیم. این یک مثال خیلی ساده، در عین حال کاربردی است.
روش کار هم به این صورت است که یک کلاسی به طور مثال به نام usings.cs میسازیم و namespace های تکراری را در آن قرار میدهیم. البته که IDE ها در این فرایند کمک خواهند کرد. این امکان به صورت زیر پیادهسازی میشود:
global using Microsoft.AspNetCore.Builder;
global using Microsoft.AspNetCore.Hosting;
global using Microsoft.AspNetCore.HttpsPolicy;
global using Microsoft.AspNetCore.Identity;
global using Microsoft.AspNetCore.Identity.UI;
global using Microsoft.EntityFrameworkCore;
global using Microsoft.Extensions.Configuration;
global using Microsoft.Extensions.DependencyInjection;
global using Microsoft.Extensions.Hosting;
global using System;
global using System.Collections.Generic;
global using System.Linq;
global using System.Threading.Tasks;
حالا به صورت زیر کلاس خودمان را تعریف میکنیم:
using LoggingTestApp.Data;
using Serilog;
namespace LoggingTestApp
{
public class Startup
{
…
}
}
البته اگر از IDE فوق العاده Rider استفاده کنید، یک قدم در راستای خلوت کردن کلاسها از قبل برداشتهاید که به صورت پیشفرض using ها را در یک region گذاشته و وقتی کلاس را باز میکنید این region به صورت پیشفرض بسته است که باعث تمرکز بیشتر روی کد خواهد شد.
FileScoped namespaces
در ادامه باز هم خواهیم دید که تیم C# چطور دارد در ابتداییترین ساختار کلاسها، که سالها است به آن عادت کردهایم، تغییراتی دوستداشتنی انجام میدهد. مورد دوم تغییر در تعریف namespace کلاس است. دیگر نیاز نیست در آخر کلاس برای تعریف namespace به دنبال کاراکتر } باشید که آیا بسته شده است یا نه. در واقع چقدر خوب میشود که هیچ وقت اسکرول به راست نکنیم (البته که اگر از Rider استفاده کنید به صورت خودکار اگر خطی طولانی باشد آن را برای ما تقسیم و چند خطی میکند).
برای پیادهسازی این feature فقط کافی است این کد
namespace MyNamespace.Services
{
class MyClass
{
}
}
به کد زیر تبدیل شود:
namespace MyNameSpace.Services;
class MyClass
{
}
حالا فکر کنید با ترکیب ویژگیهای جدید global usings و namespace چقدر کلاس خلوتتر و خواناتری داریم به ویژه برای ساخت پروژه Helloword!!
Null parameter checking
با این ویژگی دیگر نیازی نیست null بودن پارامترهای ورودی را چک کنید و این موضوع را به خود C# میسپارید. به طور مثال اگر قبل از این کد زیر را مینوشتید:
public UpdateAddress(int personId, Address newAddress)
{
if (newAddress == null)
{
throw new ArgumentNullException(“newAddress”);
}
…
}
حال میتوانید کد را به صورت زیر بنویسید:
public UpdateAddress(int personId, Address newAddress!!)
{
…}
حال اگر مقدار nullرا به پارامتر newAddress بدهیم یک ArgumentNullException به صورت خودکار رخ خواهد داد.
این تغییرات شاید به نظر کار بزرگی نباشد اما در واقع بسیار ارزشمند است. مطالعات گسترده روی خطاهای نرمافزاری نشان میدهد که خطاهای بسیار ساده، که قابل پیشگیری هم هستند، همیشه و در همه نرمافزارها رخ داده و خواهند داد. نه فقط به خاطر این که مفاهیم بسیار پیچیده است، به این دلیل که خواندن کدها کاری خستهکننده است و به مرور باعث کاهش تمرکز انسان خواهد شد. کم کردن طول کد نه تنها زمان خواندن کدها را کاهش میدهد، بلکه باعث میشود حجم کمتری از کد را در ذهن تجزیهوتحلیل کنیم. در نتیجه باعث جلوگیری از بروز باگهای احتمالی خواهد شد.
Required Properties در C# 10
در C# 9 تیم C# روی ساخت object و property ها کار کرده و امکاناتی مثل record و init را ارائه کرده بود. حالا در C# 10 با این ویژگی جدید و جالب، دیگر خیلی وقتها نیازی به نوشتن Constructor ها برای گرفتن مقادیر پیشفرض نیست. در واقع تیم C# ساخت یک object را خیلی راحتتر کرده است.
برای مثال کلاس زیر را در نظر بگیرید:
public class Customer
{
public string Name { get; set; }
public int Age { get; set; }
public DateTime RegisterDate { get; set; }
}
و ساخت این object هم به شکل زیر است:
var customer = new Customer
{
Name = “Hamid”,
Age = 34,
RegisterDate = DateTime.Now()
};
حالا تصور کنید که این object بدون داشتن مقدار برای Name معنی نخواهد داشت. راهکار مرسوم ساخت یک constructor است که این مقدار را به صورت اجباری از سازنده object گرفته و در property مورد نظر قرار دهد مثل کد زیر:
public class Customer
{
public Customer (string name)
{
Name = name;
}
public string Name { get; set; }
public int Age { get; set; }
public DateTime RegisterDate { get; set; }
}
حالا با استفاده از keyword جدید required برای همیشه با این مشکل خداحافظی خواهید کرد. به کد زیر توجه کنید:
public class Customer
{
public required string Name { get; set; }
public int Age { get; set; }
public DateTime RegisterDate { get; set; }
}
حالا دیگر Compiler اجازه ساخت object بدون ست کردن Name را نخواهد داد.
جمعبندی
۴ موردی که بررسی کردیم، تنها امکانات جدید اضافه شده C# 10 نیستند و امکانات بسیار جالب دیگری هم وجود دارد که باید ببینیم آیا در این نسخه از C# همراه خواهد شد یا خیر؟ در نهایت، هدف تیم C# مشخص است: توسعه مستمر این زبان روی ویژگیهای منطقی تا کار برای توسعهدهندگان راحتتر شود.
منبع: https://medium.com
دیدگاهتان را بنویسید