سی شارپ 10 (C# 10) نسخه جدید زبان برنامه نویسی C# میباشد که توسط مایکروسافت و تحت فریم ورک دات نت (DotNet) توسعه داده میشود. سی شارپ در ژانویه 2002 بوجود آمد. همانطور که تولد 20 سالگی این زبان برنامه نویسی محبوب نزدیک است، ما در انتظار نسخه جدید آن هستیم. هنوز تاریخ دقیقی بطور رسمی برای زمان انتشار سی شارپ 10 مشخص نشده ولی احتمالاً در نوامبر همراه با دات نت 6 (DotNet 6) منتشر خواهد شد.
درصورتی که پیج GitHub آنرا داشته باشید، میتوانید ایده ها و ویژگی های نسخه جدید را مشاهده کنید.
ممکن است کمی غافلگیرکننده باشه بههرحال اگر کنفرانس های Microsoft را دنبال و صفحه گیتهاب را همزمان بررسی کنید، میتوانید یک تصور خوب از آنچه پیشروی C# است مشاهده کنید.
5 ویژگی اصلی سی شارپ 10
- بررسی پارامتر های نال – Null Parameter Checking
- ویژگی های اجباری – Required Properties
- کلمه کلیدی فیلد – Field Keyword
- Using های سراسری – Global Usings
- فضای نام فایل – File Namespaces
-
بررسی پارامتر های نال (Null Parameter Checking)
استثنا مرجع نال (Null Reference Exception) یکی از بدترین باگ هاییست که ممکن است در برنامه شما رخ دهد.
برای جلوگیری از این خطا، به یک طراحی ضدگلوله و تعداد زیادی بررسی ورودی های متد برای برنامه نیاز دارید، این ویژگی جدید کد شما را قوی تر و خواناتر میکند.
در حال حاضر برای بررسی نال بودن یک پارامتر باید بصورت زیر عمل کنید:public SomeFunction(int id, SomeClass newObject)
{
if (newObject == null)
{
throw new ArgumentNullException("newObject");
}
// Code Here
}
در این متد یک شئ بنام newObject از نوع SomeClass به پارامتر SomeFunction دادیم. درصورتی که این شئ مقداردهی نشده باشد (null باشد) نباید متد را ادامه دهیم.
شاید بگویید با معماری درست این مشکل نباید اتفاق بیفتد ولی گاهی ممکن است این خطا رخ دهد.
رفع مشکل در سی شارپ 10
در نسخه جدید، هدف رفع این مشکل با سادگی کار است. فقط باید !! را به انتهای نام پارامتر اضافه کنید.public SomeFunction(int id, SomeClass newObject!!)
{
// Code Here
}
در این مثال، کد بصورت خودکار null بودن newObject را بررسی و درصورت null بودن، خطای ArgumentNullException را اجرا میکند. -
ویژگی های اجباری (Required Properties)
امروزه دیگر از سازنده (Constructor) های سنگین استفاده نمیکنیم و بیشتر از سازنده های سبک استفاده میکنیم که یعنی مقادیر را مستقیم به فیلدها میدهیم.
در بیشتر ورژن های C# با استفاده از سازنده های سبک مانند زیر اشیا را ایجاد میکنیم:var newArticle = new Article
{
Title = "C# 10 - Top 5 new features",
Category = ".NET",
ReleaseDate = DateTime.Now()
}
مشکل اصلی این است که گاهی ما باید ویژگی هایی را مقداردهی کنیم ولی این کار را انجام نمیدهیم.
برای مثال ممکن است شئ را بدون مقداردهی Title ایجاد کنیم، اگرچه ایجاد یک مقاله بدون عنوان منطقی نیست.رفع مشکل در C# 10
در سی شارپ 10 کلمه کلیدی required برای ویژگی ها (Properties) معرفی میشود. در این حالت ما در هنگام ایجاد کلاس، میتوانیم یک فیلد را اجباری کنیم، درصورتی که هنگام نمونه سازی از کلاس، این فیلد مقداردهی نشود یک خطای زمان کامپایل رخ میدهد.public class Article
{
public required string Title {get; init;}
public string Category {get; init;}
public DateTime ReleaseDate {get; init;}
} -
کلمه کلیدی فیلد (Field Keyword)
ویژگیهای پیادهسازی شده خودکار قابلیت جدیدی نیست، در واقع از C# 3 وجود دارند. به این معنی که زمانی که کد کامپایل میشود، کامپایلر یک فیلد پشتیبان خصوصی و ناشناس ایجاد میکند که فقط از طریق get و set قابل دسترسی است. یک از ویژگیهای جالب این نسخه از سی شارپ init accessorها میباشند. با استفاده از این accessor اشیا تغییر ناپذیر انعطافپذیرتر میشوند.
این خیلی خوب است ولی زمانی که این روش مشکل شما را حل نمیکند، شما باید فیلد پشتیبان اضافه کنید و دستورات معمول فیلدها را بنویسید. مانند زیر:public class Article
{
private string _title;
public string Title
{
get
{
return _title;
}
set
{
if (value.Trim() == "")
throw new ArgumentException("Title can't be empty");
_title = value;
}
}
}رفع مشکل در C# 10
سی شارپ 10 یک کلمه کلیدی جدید بنام field را معرفی میکند. کد بالا اکنون میتواند ساده شود:public class Article
{
public string Title
{
get;
set
{
if (value.Trim() == "")
throw new ArgumentException("Title can't be empty");
field = value;
}
}
}در اصل در سی شارپ 10 نیازی به تعریف فیلد پشتیبان ندارید. این کلمه کلیدی حتی میتواند در init accessor تعریف شود:
public class Article
{
public string Title
{
get;
set
{
if (value.Trim() == "")
throw new ArgumentException("Title can't be empty");
field = value;
}
}
public string Category { get; init; }
public DateTime ReleaseDate{ get; init => field = value.Date(); }
} -
Using های سراسری (Global Usings)
این یک قابلیت جدید است که کد را خیلی سادهتر میکند. همانطور که مطلع هستید هر فایل C# با لیست using های مورد نیاز برای پیادهسازی شروع میشود.
بخصوص اگر از ASP.NET استفاده میکنید آن کد بسیار تکرار و باعث نویز در کد میشود.
اگر به عنوان مثال یک فایل ASP.NET را در نظر بگیریم ، لیست موارد استفاده بسیار زیاد است:using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.HttpsPolicy;
using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Identity.UI;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;ویژگی سی شارپ 10
با استفاده از global، کلمه کلیدی دیگری که معرفی میشود، میتوانید using های سراسری در کل پروژه تعریف کنید.
معمولاً بهتر است using های سراسری را در یک فایل جداگانه مانند usings.cs یا imports.cs تعریف کنید.
به این صورت فایل های دیگر نیازی به استفاده از تمام این using ها ندارند.
طراحان C# به این کار حذف اضافات عمودی میگویند.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; -
فضای نام فایل (File Namespaces)
سی شارپ با استفاده از کلمه کلیدی global اضافات عمودی را حذف میکند. اساساً این ویژگی برای حل مشکل تو رفتگی میباشد و بیشتر یک تغییر زیبایی است که خوشبختانه کد شما را تمیزتر میکند.