علی شکرالهی
بنیانگذار توسینسو و توسعه دهنده

معرفی 5 قابلیت جدید سی شارپ 10 که احتمالا نمی شناسید

داریم به 20 سالگی زبان سی شارپ که از سال 2002 پا به عرصه ی هستی گذاشت ، نزدیک میشیم . در این مطلب قصد داریم تا 5 ویژگی جدید که در نسخه ی 10 سی شارپ ارائه میشه رو بررسی کنیم .

دوره های شبکه، برنامه نویسی، مجازی سازی، امنیت، نفوذ و ... با برترین های ایران


1. Null Parameter Checking

یکی از خطاهای رایج و اذیت کن در دات نت ، خطای Null Reference هست که در بعضی مواقع پیدا کردنش واقعا سخت و دشوار هست.

مثال زیر رو در نظر بگیرید:

public MyMethod(int id, ClassA obj)
{
if (obj == null)
{
   throw new ArgumentNullException("obj");
}
.
.
.
}

در حال حاضر برای بررسی null بودن یا نبودن obj ، بایستی با یک شرط if بررسی کنیم و اگر null بود خطای ArgumentNullException رو raise کنیم و درغیر این صورت اجرای کد ادامه پیدا کنه .

اما در نسخه ی جدید میتونیم به شکل زیر عمل کنیم :

public MyMethod(int id, ClassA obj!!)
{
.
.
.
}

با اضافه کردن !! به نام پارامتر ، دیگه نیازی به اضافه کردن شرط در مثال قبلی نیست و کامپایلر کدهای مربوطه رو برای پارامتر تعیین شده اضافه میکنه .

2. Required Properties

میشه گفت دیگه مثل سابق با سازنده (Constructor) سنگین و پر پارامتر روبرو نیستیم ، و عموما از ویژگی Object initializer برای مقدار دهی پراپرتی ها استفاده میکنیم.

مثال زیر رو در نظر بگیرید:

var book = new Book
{
     Title = "Pro C# 10",
     Category = "C#",
     Price = 22.5,
     /*ISBN = "1234" */
}

در مثال بالا ما از Object initializer برای مقدار دهی پراپرتی ها استفاده کردیم . اما مشکل اصلی در مثال بالا این هست که ممکنه ما یک پراپرتی با نام ISBN داشته باشیم و فراموش کنیم که اون رو مقدار دهی کنیم و در هنگام اجرا باعث بروز یک مشکل بشه .

برای جلوگیری از فراموشی همچین مواردی ، قابلیتی جدیدی به اسم required به سی شارپ 10 اضافه شده که تا در صورتی که پراپرتی required مقدار دهی نشده باشه جلوی کامپایل کد مارو بگیره.

public class Book
{
public required string Title { get; set; }
public string Category { get; set; }
public decimal Price{ get; set; }
public required string ISBN { get; set; }
}

همونطور که در مثال بالا میبینید ، ما property های Title و ISBN رو required کردیم و با اینکار ، در صورتی که جایی یک object از کلاس book درست کرده باشیم و پراپرتی های Title  و ISBN رو مقدار دهی نکرده باشیم ، خطای compile میگیریم و قبل از وقوع فاجعه جلوی مسئله رو میگیریم.

3. Field keyword

یکی از ویژگی های خوب C# که در نسخه ی 3 معرفی شد ، Auto Property ها بودن . قبل از این نسخه اگر شما میخواستید یک پراپرتی تعریف کنید ، مجبور بودید که برای پراپرتی یک فیلد private هم تعریف کنید . اما با این قابلیت ، فیلد مربوطه توسط کامپایلر اضافه میشد و کار راحت میشد . اما گاهی نیاز هست که شما مثلا در setter پراپرتی ، یک منطقی رو پیاده سازی کنید که در این صورت بازهم مجبور میشیم که بصورت دستی فیلد private رو تعریف کنیم.

مثال زیر رو در نظر بگیرید:

public class Book
{
private string _title;
public string Title
{
   get
   {
     return _title;
   }
   set
   {
     if (string.IsNullOrWhiteSpace(value))
       throw new ArgumentException("Title can't be empty");

      _title = value;

    }
}
}

همونطور که در مثال بالا میبینید ، ما در setter ، یه منطقی رو پیاده کردیم که اگر مقداری که کاربر سِت میکنه خالی بود ، یک خطا ایجاد کنه و در غیر این صورت مقدار دهی رو به فیلدی که بصورت دستی تعریف شده ، انجام بده.

اما در سی شارپ 10 یک keyword جدید به نام field اضافه شده که این موارد رو خیلی ساده تر کرده برامون . در سی شارپ 10 کد بالا به شکل زیر میتونه تغییر پیدا کنه :

public class Book
{
public string Title
{
   get;
   set
   {
     if (string.IsNullOrWhiteSpace(value))
       throw new ArgumentException("Title can't be empty");
     field = value;
   }
}
}

همونطور که در میبینید ، دیگه خبری از تعریف private field نیست ، و در خط اخر بخش set  ، ما با استفاده از کلیدواژه ی field مقدار جدید رو به فیلدی که توسط کامپایلر ایجاد میشه ، سِت میکنیم .

4. Global Usings

همونطور که میدونید ، در ابتدای اکثر فایلهای سی شارپ ما ، یک سری using هست که برای دسترسی به سایر کلاس ها و اعضای سایر بخشهای سیستم نیاز هست . مثلا در یک پروژه ی asp.net ، حجم زیادی از این using رو در ابتدای همه ی فایلهامون میبینیم.

مثال زیر رو در نظر بگیرید:

using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.HttpsPolicy;
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;

using های بالا ، غالبا در اکثر فایلهای مربوط به یک پروژه ی asp.net استفاده میشن و در هر فایل هم تکرار

در C# 10 کلیدواژه ی global برای using ها معرفی شده که این امکان رو میده تا بتونیم ، using های پرکاربرد و پرتکرار رو در یک فایل جدا (مثلا usings.cs) قرار بدیم و سایر بخشهای پروژه هم از اون using ها استفاده میکنن و دیگه نیازی به تکرارشون در تمام فایل ها نیست .

global using Microsoft.AspNetCore.Builder;
global using Microsoft.AspNetCore.HttpsPolicy;
global using Microsoft.AspNetCore.Hosting;
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;

5. File Namespaces

دو تا گزاره داریم یکی vertical waste ، یکی هم horizontal waste .

در ویژگی 4 ، با استفاده از کلیدواژه ی global ، ما از vertical waste جلوگیری کردیم (رشد فایل ها بصورت عمودی کم میشه، چون using های پرکاربرد از فایلهامون حذف میشن )

با استفاده از ویژگی 5 ، جلوی horizontal wasteرو میتونیم بگیریم (که بیشتر اشاره به indentation ها داره ، یعنی بصورت افقی، کدهامون جای کمتری میگیرن )

حالا چطوری ؟

خوب در تمام فایلهای cs ، بعد از using ها ما با namespace مواجه میشیم که مثلا به شکل زیر میشه :

namespace Library
{
public class Book
{
   ...
}
}

همونطور که در بالا میبید ، namespace باعث اضافه شدن curly brace شده و همینطور indentation (تورفتکی) در تعریف کلاس Book شده.

در سی شارپ 10 یه ویژگی خوب اضافه شده که این بخش رو به شکل خوبی مدیریت میکنه:

namespace Library;
public class Book
{
...
}


امیدوارم که این مطلب براتون مفید بوده باشه


علی شکرالهی
علی شکرالهی

بنیانگذار توسینسو و توسعه دهنده

علی شکرالهی، بنیانگذار TOSINSO ، توسعه دهنده وب و برنامه نویس موبایل، مهندسی نرم افزار از دانشگاه آزاد اسلامی واحد کرج ، بیش از 15 سال سابقه ی فعالیت های حرفه ای و آموزشی

15 تیر 1400 این مطلب را ارسال کرده

نظرات