"> ویژگی های جدید در C# 6.0 بخش اول

ویژگی های جدید در C# 6.0 بخش اول

C# 6.0

مایکروسافت تعدادی کلمات کلیدی و حرکت های جدیدی در از C# 6.0 در ویژوال استودیو ۲۰۱۵ اعلام کرده است. در این مقاله به تفاوت های این نسخه ی جدید با نسخه ی پیشین به صورت کد و تصویر و با توضیحات کامل میپردازیم. بخش دوم این مقاله نیز به زودی آماده میشود … برای دیدن سر فصل های این بخش میتوانید به ادامه ی مطلب مراجعه کنید …

در این مقاله سرفصل های زیر را خواهیم آموخت :

۱ ) استفاده از Static

۲ ) Property اولیه ی اتوماتیک

۳ ) دیکشنری اولیه

۴ ) اصطلاح nameof

۵ ) روش های جدیدی برای فیلتر استثنائات

۶ ) در انتظار Catch و در بلاک finally

۷ ) Null – اپراتور شرطی

۸ ) اصطلاحات – متد های بدنه

۹ ) رشته هایی با قابلیت فرمت آسان – رشته ی الحاقی

برای تست کردن همه

ویژوال استودیوی ۲۰۱۵ را باز کنید و یک پروژه ی Console Application جدید بسازید.

C# 6.0

بر روی OK کلیک کنید و سپس یک Solution دریافت میکنید که میتوانید در Solution Explorer آن را ببینید.

C# 6.0

حال کاری با فایل program.cs خود برای تست کردن کد زمان کامپایل انجام دهید.

۱ ) استفاده از Static

این یکی از وجوه جدید از C# 6.0 است که به ما اجازه استفاده از هر کلاسی که به عنوان یک فضای نام Static است میدهد که برای هر برنامه نویسی مفید خواهد بود که در فایل کدی که میخواهیم متد های Static را از یک کلاس Static صدا بزنیم مثل تعداد دفعاتی که احتیاج به فراخوانی متد های زیادی داریم. ToInt32() یا Console.Write() و Console.WriteLine() پس ما ابتدا نیاز به نوشتن نام کلاس داریم سپس نام متد هربار در C# 5.0. در C# 6.0 هرچند که مایکروسافت رفتار جدیدی را به کامپایلر CS مان معرفی کرده است که به ما اجازه ی فراخوانی متد های Static از کلاس های Static بدون نام کلاس ها را میدهد زیرا اکنون ابتدا نیاز داریم که از نام کلاس Static در شروع با همه ی فضای نام ها استفاده کنیم.

در C# 5.0

C# 6.0

در C# 6.0

C# 6.0

کد در C# 5.0

using System;   
using System.Collections.Generic;   
using System.Linq;   
using System.Text;   
using System.Threading.Tasks;   
namespace TestNewCSharp6   
{   
    class Program   
    {   
        static void Main(string[] args)   
        {   
            Console.WriteLine("Enter first value ");   
            int val1 =Convert.ToInt32(Console.ReadLine());   
            Console.WriteLine("Enter next value ");   
            int val2 = Convert.ToInt32(Console.ReadLine());   
            Console.WriteLine("sum : {0}", (val1 + val2));   
            Console.ReadLine();   
        }   
    }   
}  

 

کد در C# 6.0

using System;   
using System.Collections.Generic;   
using System.Linq;   
using System.Text;   
using System.Threading.Tasks;   
using System.Convert;   
using System.Console;   
namespace Project1   
{   
class Program   
{   
static void Main(string[] args)   
{   
WriteLine("Enter first value ");   
int val1 = ToInt32(ReadLine());   
WriteLine("Enter next value ");   
int val2 = ToInt32(ReadLine());   
WriteLine("sum : {0}", (val1+val2));   
ReadLine();   
}   
}   
} 

 

حال میتوانید تفاوت ها را خودتان ببینید , کد کمتری وارد میشود ولی خروجی یکسان خواهد بود.

خروجی

C# 6.0

۲ ) Property اولیه ی اتوماتیک

Property اولیه ی اتوماتیک یک وجه جدید دیگر برای تعیین مقدار یک Property در طول اعلان Property. میتوانیم مقدار پیش فرض Property را بر روی read=only قرار دهیم. به این معناست که Property که فقط یک خاصیت {get;} دارد. در ورژن قبلی C# 5.0 میتوانیم تعیین مقادیر Property را در ساختار های پیش فرض کلاس انجام دهیم. بیاید مثالی داشته باشیم. فرض کنید نیاز داریم که مقداری Property از کلاس را همانند زیر تعیین کنیم:

درC# 5.0

C# 6.0

کد

using System;   
using System.Collections.Generic;   
using System.Linq;   
using System.Text;   
namespace TestNewCSharp6   
{   
    class Emp   
    {   
        public Emp()   
        {   
            Name = "nitin";   
            Age = 25;   
            Salary = 999;   
        }   
        public string Name { get; set; }   
        public int Age { get; set; }   
        public int Salary { get;private set; }   
    }   
} 

 

در اینجا میتوانیم مقدار پیش فرض Property را تنها با ساختار ها تعیین کنیم.

در C# 6.0

C# 6.0

کد

using System;   
using System.Collections.Generic;   
using System.Linq;   
using System.Text;   
using System.Threading.Tasks;   
namespace Project2   
{   
class Emp   
{   
public string Name { get; set; }="nitin";   
public int Age { get; set; }=25;   
public int Salary { get; }=999;   
}   
}

 

در اینجا میتوانیم مقدار پیش فرض Property را در همان خط مقداردهی اولیه کنیم.

۳ ) دیکشنری اولیه

دیکشنری اولیه یک وجه جدید در C# 6.0 است . میتوانیم به طور مستقیم مقدار یک کلید درکالکشن دیکشنری را در آن مقداردهی اولیه کنیم چه کلید موجود در کالکشن یک داده نوع رشته ای باشد چه هر نوع داده ی دیگری. بگذارید سینتکس اعلان را در هر دو ورژن C# 5.0 و C# 6.0 را به ترتیب ببینیم :

در C# 5.0

C# 6.0

کد

using System;   
using System.Collections.Generic;   
using System.Data;   
using System.Linq;   
using System.Text;   
using System.Threading.Tasks;   
namespace TestNewCSharp6   
{   
class Program   
{   
static void Main(string[] args)   
{   
Dictionary<string, string> dicStr = new Dictionary<string, string>()   
{   
{"Nitin","Noida"},   
{"Sonu","Baraut"},   
{"Rahul","Delhi"},   
};   
dicStr["Mohan"] = "Noida";   
foreach (var item in dicStr)   
{   
   Console.WriteLine(item.Key+"   "+ item.Value);   
}   
Console.WriteLine("********************************************************************");   
Dictionary<int, string> dicInt = new Dictionary<int, string>()   
{   
{۱,"Nitin"},   
{۲,"Sonu"},   
{۳,"Mohan"},   
};   
dicInt[4] = "Rahul";   
foreach (var item in dicInt)   
{   
 Console.WriteLine(item.Key + "   " + item.Value);   
}   
Console.Read();   
}   
}   
}

 

در C# 6.0

C# 6.0

کد

using System;   
using System.Collections.Generic;   
using System.Data;   
using System.Linq;   
using System.Text;   
using System.Threading.Tasks;   
namespace Project3   
{   
    class Program   
    {   
        static void Main(string[] args)   
        {   
            Dictionary<string, string> dicStr = new Dictionary<string, string>()   
            {   
                ["Nitin"]="Noida",   
                ["Sonu"]="Baraut",   
                ["Rahul"]="Delhi",   
            };   
            dicStr["Mohan"] = "Noida";   
            foreach (var item in dicStr)   
            {   
                Console.WriteLine(item.Key + "   " + item.Value);   
            }   
            Console.WriteLine("********************************************************************");   
            Dictionary<int, string> dicInt = new Dictionary<int, string>()   
            {   
              [۱]="Nitin",   
              [۲]="Sonu",   
              [۳]="Mohan"   
            };   
            dicInt[4] = "Rahul";   
            foreach (var item in dicInt)   
            {   
                Console.WriteLine(item.Key + "   " + item.Value);   
            }   
            Console.Read();   
        }   
    }   
}  

 

در اینجا میتوانیم مقادیر دیکشنری را مستقیما توسط عملگر = مقداردهی اولیه کنیم. در C# 5.0 نیاز به ساخت یک شئ به عنوان {key,value} جفتی و خروجی در هر دو ورژن یکسان است.

خروجی

C# 6.0

۴ ) اصطلاح nameof

Nameof یک کلمه کلیدی جدید در C# 6.0 است و از دید یک برنامه نویس بسیار مفید است زیرا زمانی که ما احتیاج به استفاده از یک Property , تابع و یا نام یک عضو داده درون یک پیام به عنوان یک رشته داریم پس باید از نام به عنوان یک hard-coded در “name” در رشته و در Property ها آینده مان استفاده کنیم وگرنه نام متد عوض خواهد شد پس باید همه ی پیام های فرم ها را یا صفحات را تغییر دهید پس این بسیار دشوار است که به خاطر داشته باشید که چند بار از این نام در پروژه استفاده کرده اید که این کار از داشتن رشته های تعیین شده ی hardcoded در کد مان همانند استفاده از reflection برای دریافت نام , جلوگیری میکند. نگاهی به این مثال بیاندازیم :

کلاسی داریم :

C# 6.0

و باید مقدار property این کلاس را به کنسول نشان دهیم و همچنین اگر احتیاج به چاپ نام Property همراه با پیام هم بود پس در C# 6.0 میتوانیم از اصطلاح nameof به جای hardcoded نام Property استفاده کنیم.

C# 6.0

خروجی

C# 6.0

کد

using System;   
using System.Collections.Generic;   
using System.Linq;   
using System.Text;   
using System.Threading.Tasks;   
using System.Console;   
namespace Project4   
{   
class Program   
{   
static void Main(string[] args)   
{   
Employee emp = new Employee();   
WriteLine("{0} : {1}", nameof(Employee.Id), emp.Id);   
WriteLine("{0} : {1}", nameof(Employee.Name), emp.Name);   
WriteLine("{0} : {1}", nameof(Employee.Salary), emp.Salary);   
ReadLine();   
}   
}   
class Employee   
{   
public int Id { get; set; } = 101;   
public string Name { get; set; } = "Nitin";   
public int Salary { get; set; } = 9999;   
}   
}

 

۵ ) فیلتر های استثنائات

فیلتر های استثنائات وجوه جدید برای C# است. در C# 6.0 در کامپایلر VB پشتیبانی میشود اما حالا به C# نیز آمده اند. فیلتر های استثنائات به ما اجازه ی مشخص کردن یک شرط با یک بلاک catch را میدهد پس اگر شرایط true را برگردانند آنگاه بلاک catch تنها در صورت برقرار بودن شرایط اجرا میشود. این بهترین خاصیت از C# 6.0 جدید بوده است که کار با فیلتر کردن استثنائات را آسان کرده و همچنین اینکه کد نوع شامل مقادیر زیادی سورس کد میباشد. بیایید مثالی داشته باشیم.

C# 6.0

کد

using System;   
using System.Collections.Generic;   
using System.Linq;   
using System.Text;   
using System.Threading.Tasks;   
using System.Console;   
namespace project5   
{   
class Program   
{   
static void Main(string[] args)   
{   
int val1 = 0;   
int val2 = 0;   
try   
{   
WriteLine("Enter first value :");   
val1 = int.Parse(ReadLine());   
WriteLine("Enter Next value :");   
val2 = int.Parse(ReadLine());   
WriteLine("Div : {0}", (val1 / val2));   
}   
catch (Exception ex) if (val2 == 0)   
{   
WriteLine("Can't be Division by zero ☺");   
}   
catch (Exception ex)   
{   
WriteLine(ex.Message);   
}   
ReadLine();   
}   
}   
} 

 

خروجی

اگر همه ی مقادیر وارد شده توسط کاربر صحیح باشند آنگاه خروجی خواهد بود :

C# 6.0

اگر کاربر مقادیر نامعتبر برای تقسیم مانند صفر وارد کند آنگاه استثنایی ارسال خواهد کرد که توسط فیلتر کردن استثنائات کنترل شود جایی که شما به if() با بلاک catch{} اشاره کرده باشید و خروجی وجود خواهد داشت.

۶ ) منتظر ماندن در catch و در بلاک finally

این یک رفتار جدید در C# 6.0 است که حال قادریم متد های async را از catch و همچنین از finally فراخوانی کنیم. استفاده از متد های async بسیار مفید هستند زیرا فراخوانی و سپس همگام سازی صورت میگیرد و در حین کار کردن با async و await , ممکن است به همچین موردی خورده باشید که بخواهید بعضی از نتایج را در بلاک های catch یا finally یا هردو منتظر باقی بگذارید. فرض کنیم که ما احتیاج به فراخوانی یک متد async داریم و یک بلاک try و catch نیز وجود دارد پس زمانی که استثنا رخ دهد به داخل بلاک catch ارسال میشود. احتیاج به نوشتن اطلاعات log درون یک فایل یا ارسال یک سرویس فراخوانی برای ارسال جزئیات استثنا به سرور برای فراخوانی متد همگام سازی تا از انتظار نیز در catch{} استفاده کنید و این تنها در C# 6.0 امکان پذیر است. بیایید مثالی داشته باشیم:

ما یک کلاس داریم و متدی وجود دارد که async است و نیاز داریم که آن را با دو پارامتر فراخوانی کنیم و اگر استثنایی بوجود آمد آنگاه استثنا را برگشت داده و به بلاک catch برویم و سپس یک متد async با استفاده از await و finally و سپس مشابه همان را در finally فراخوانی کرده ایم.

C# 6.0

فراخوانی async div () در Main().

C# 6.0

کد

using System;   
using System.Collections.Generic;   
using System.Linq;   
using System.Text;   
using System.Threading.Tasks;   
using System.Console;   
namespace project6   
{   
    class Program   
    {   
        static void Main(string[] args)   
        {   
            MyMath obj = new MyMath();   
            obj.Div(12, 0);   
            ReadLine();   
        }   
    }   
    public class MyMath   
    {   
        public async void Div(int value1, int value2)   
        {   
            try   
            {   
                int res = value1 / value2;   
                WriteLine("Div : {0}", res);   
            }   
            catch (Exception ex)   
            {   
                await asyncMethodForCatch();   
            }   
            finally   
            {   
                await asyncMethodForFinally();   
            }   
        }   
        private async Task asyncMethodForFinally()   
        {   
            WriteLine("Method from async finally Method !!");   
        }   
   
        private async Task asyncMethodForCatch()   
        {   
            WriteLine("Method from async Catch Method !!");   
        }   
    }   
}  

 

خروجی

اگر استثنایی وجود نداشت آنگاه خروجی زیر را خواهیم داشت :
C# 6.0

و زمانی که استثنا ظاهر خواهد داشت :

C# 6.0

۷ ) Null – اپراتور شرطی

Null- اپراطور شرطی یکی از وجه های جدید دیگر در C# 6,0 است که بسیار زیاد برای برنامه نویسان در فایل سورس کد که بخواهیم مقایسه ی یک شئ یا یک نوع مرجع داده با Null را داشته باشیم مفید است. پس باید چندین خط کد برای مقایسه در نسخه های قبلی C# 5.0 مینوشتیم اما در C# 6.0 میتوانیم یک in-line-null-condititional با اپراتور های ?? و ? بنویسیم پس حال بیاید مثالی داشته باشیم و هردو نسخه ی ورژن های C# 5.0 در برابر C# 6.0. ما کد را برای هر دو ورژن مینویسیم .

فرض کنیم که دو کلاس در اختیار داریم :

C# 6.0

حال نیاز داریم کد را برای مقایسه ی اشیای کلاس employee با null در C# 5.0 مقایسه کنیم. پس نیاز داریم که if() و چندین خط else بنویسیم.

C# 6.0

اگر بخواهیم که مشابه همان کد را در C# 6.0 بنویسیم میتوانیم از ? و ?? برای چک کردن مقدار null بودن یک شئ استفاده کنیم. همانند زیر :

شرط ? کدی که در این مورد است null نیست و ?? برای موردی که null است.

C# 6.0

خروجی

خروجی در زمانی که هیچ شئ null نباشد :

C# 6.0

خروجی برای زمانی که یک شئ null باشد :

C# 6.0

کد

using System;   
using System.Collections.Generic;   
using System.Linq;   
using System.Text;   
using System.Threading.Tasks;   
using System.Console;   
namespace project7   
{   
class Program   
{   
static void Main()   
{   
Employee emp = new Employee();   
emp.Name = "Nitin Pandit";   
emp.EmployeeAddress = new Address()   
{   
HomeAddress = "Noida Sec 15",   
OfficeAddress = "Noida Sec 16"   
};   
WriteLine((emp?.Name) + "  " + (emp?.EmployeeAddress?.HomeAddress??"No Address"));   
ReadLine();   
}   
}   
class Employee   
{   
public string Name { get; set; }   
public Address EmployeeAddress { get; set; }   
}   
class Address   
{   
public string HomeAddress { get; set; }   
public string OfficeAddress { get; set; }   
}   
}

 

۸) expression-Bodied Methodes

اصطلاح – متد بدنه راهی بسیار مفید برای نوشتن یک تابع از یک روش جدید و همچنین بسیار خوب برای آن دسته از متد هایی که مقادیر خود را توسط یک خط برمیگردانند است تا ما بتوانیم آن متد ها را با استفاده از “=>” (lambda operator) در C# 6.0 پیاده سازی کنیم. حال بیایید به سراغ یک مثال برویم.

ما یک متد که تنها یک مقدار را با استفاده از یک پیام از مقدار رشته برمیگرداند را در هر دو ورژن مینویسیم :

در C# 5.0

C# 6.0

در C# 6.0

C# 6.0

خروجی

خروجی در هر دو مشابه خواهد بود :

C# 6.0

کد

using System;   
using System.Collections.Generic;   
using System.Linq;   
using System.Text;   
using System.Threading.Tasks;   
using System.Console;   
namespace Project8   
{   
    class Program   
    {   
        static void Main(string[] args)   
        {   
            WriteLine(GetTime());   
            ReadLine();   
        }   
        public static string GetTime()=> "Current Time - " + DateTime.Now.ToString("hh:mm:ss");   
          
    }   
}  

 

۹ ) امکان فرمت آسان رشته ها با استفاده از String interpolation

برای فرمت آسان یک مقدار رشته در C# 6.0 بدون هیچ متد string.Format() میتوانیم یک فرمت برای یک رشته بنویسیم. این یک پروسه ی بسیار مفید و زمان بر برای تعیین چندین مقدار رشته توسط “\{variable}” است. حال بیاید مثالی بر روی String interpolation داشته باشیم. ایتا ما سورس کد را با استفاده از string.format() مینویسیم.

C# 6.0

حال با “\{variable}” :

C# 6.0

خروجی

خروجی در هردو مشابه خواهد بود اما \{variable} کد کوتاه تری خواهد داشت.

C# 6.0

کد

using System;   
using System.Collections.Generic;   
using System.Linq;   
using System.Text;   
using System.Threading.Tasks;   
using System.Console;   
namespace Project9   
{   
    class Program   
    {   
        static void Main()   
        {   
            string FirstName = "Nitin";   
            string LastName = "Pandit";   
   
            // With String Interpolation in C# 6.0   
            string  output= "\{FirstName}-\{LastName}";   
            WriteLine(output);   
            ReadLine();   
        }   
    }   
}   

 

ممنون از شما بابت خواندن این مقاله !
امیدوارم از آن لذت برده باشید …

  • پسورد: www.mspsoft.com
داریوش فرخی

داریوش فرخی هستم از سال 92 شروع به یادگیری برنامه نویسی و از سال 93 در بخش برنامه نویسی و تولید محتوای سایت mspsoft.com مشغول هستم. فعالیتم نیز بیشتر در زمینه های برنامه نویسی با سی شارپ و asp.net بوده است. اوقات فراغتم را هم غالبا با تماشای فیلم یا بازی های کامپیوتری پر میکنم .

نوشته‌های مرتبط

دیدگاه‌ها

*
*

این سایت از اکیسمت برای کاهش هرزنامه استفاده می کند. بیاموزید که چگونه اطلاعات دیدگاه های شما پردازش می‌شوند.