ویژگی های C# نسخه 7

   
نام نویسنده:
|
دسته بندی:
|
در حالیکه شما همچنان در تلاشید تا ویژگی های جدید   #C نسخه 6را یاد گرفته و استفاده کنید، تیم برنامه نویسی بر روی طراحی ویژگی های #C نسخه 7 تمرکز کرده اند.زمانی# Cیک زبان برنامه نویسی فشرده ی کوچک بود و پس از آن با افزایش ویژگی ها، می توانست کارهایی که بیشتر زبان های برنامه نویسی انجام می دادند، پیاده سازی کند. اکنون،  # C  تبدیل به یک زبان برنامه نویسی چند مدلی (Multiparadigm) شده است و هنوز در حال توسعه است.


MadsTorgerson، مدیر برنامه نویس زبان# C، لیستی از ایده های ممکن برای پیاده سازی در نسخه ی بعدی این زبان را، منتشر کرده است. البته هیچکدام از این ایده ها ثابت نیستند و ممکن است پیاده سازی نشوند، ولی ایده هایی هستند که جالب به نظر می آیند و هر کدام دسته بندی شده اند، ایده های قویا جالب، ایده های جالب، ایده های کوچک ولی کاربردی، جالب و نیازمند حمایت CLR، نامناسب برای این زمان و ...
می توانید لیست کامل این نوشته را در GitHub مشاهده کنید، در ادامه نگاهی به بعضی از ایده های جالب می اندازیم.


Tupleها
زبان هایی مانند پایتون از تاپل ها حمایت می کند و بزرگترین مشکل، توضیح کاربرد تاپل هاست. اگر C# لیست بدون نوع ندارد و لی ساده تر می تواند کاربرد تاپل را مشخص کند. یک tuple، یک گروه از ارزش هایی با نوع معلوم است که برای اهداف موقتی در کنار یکدیگر جمع شده اند. برای مثال، به گروهی از پارامترهای یک متد، تاپل ورودی گفته می شود. ایده اینست که می توان این کاربرد را بسط داد و تاپلی برای خروجی های متد در نظر گرفت.
برای مثال:


Public (int sum, int count) myMethod(parameters){

Return (s,c);
}
و
Var t=myMethod();
Console.write (t.sum, t.count);


شما می توانید این تاپل را به عنوان یک تاپل بی نام مشاهده کنید که تنها به شما نحوه ی پیاده سازی آن را نشان می دهد.


تطابق الگو و انواع جبری
ایده ی کاربردی دیگری که برای# Cپیشنهاد می شود، تطابق الگو است. این ایده شرایط قدرتمندتر و ساده تری برپایه ی نوع عبارت (expression) می دهد. برای مثال، به جای نوشتن کد زیر:


Var v=x as int;
If (v!=null) {code that uses v as an int};


می توان اینگونه نوشت :


If (x is int v) {code that uses v as an int};


این یک تغییر کوچک است ولی مثال int، شروع نوع الگوهای پیچیده ای است که شما مشخص می کنید. الگوهایی که در Switch استفاده می شود به صورت زیر است:


Switch (e) {
Case type:action;…}


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


Public record class Point (double x,double y)


شما می توانید مشاهده کنید که این خط کد چگونه به یک کلاس استاندارد کامپایل می شود. اکنون یک نوع جدید Point(double,double) وجود دارد که در تطابق الگو می توان استفاده کرد.
برای اطلاع از توانمندی این ایده می توان به مثالی که در طرح پیشنهادی آمده است دقت کرد. ابتدا چندین نوع مناسب برای نمایش عبارت چند جمله ای نمادین X تعریف می کنیم:


abstract class Expr;
class X() : Expr;
class Const(double value) : Expr;
class Add(Explr Left, Expr Right) : Expr;
class Mult(Expr left, Expr Right) : Expr;
class Neg(Expr Value) : Expr;


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


ExprDeriv(Expr e){
 Switch (e) {
    Case X() : return Const(1);
    Case Const(*) : return Const(0);
    Case Add(var Left, var Right):
        Return Add(Deriv(Left) , Deriv(Right));
    Case Mult(var Left, var Right):
    Return Add(Mult(Deriv(Left), Right), Mult(Left, Deriv(Right)));
        Case Neg(var Value) : return Neg(Deriv(Value));
}
}


ارجاعات non-nullable
این مورد طرح کوچکتری نسبت به الگوها و رکوردها می باشد و راهی است که در آن کامپایلر فقط کد را چک می کند و نیازی به چک کردن زبان میانی تولید شده نیست. مثلا اگر شما از نوعی مانند Cat استفاده کنید نیازی به تغییرات دیگر نیست ولی اگر یک ! بعد از آن قرار دهید، یعنی Cat!، دیگر این نوع نمی تواند خالی باشد و یک ارجاع اجباری نیاز دارد. به این معنی که کامپایلر تلاش خود را می کند تا یک ارجاع را به null نسبت دهد.


Cat! Cat=null;


در این حالت کامپایلر با خطای زمان مواجه می شود. کامپایلر به شما اجازه می دهد که از ارجاعات اجباری بدون چک کردن null استفاده کنید. یک ارجاع خالی، بوسیله ی ?، مشخص می شود و همیشه قبل از اینکه استفاده شود باید چک شود. برای مثال:


Cat? cat=null

;
خط کد بالا درست است ولی اگر بنویسید:


cat.meow();


با یک خطای زمان مواجه می شوید. تنها روشی که می توان از ارجاعات nullable استفاده کرد، چک کردن آن قبل از استفاده است:


Check(cat)
{
Cat.meow();
}
Else
{
Cat is null
}


می توان با هر روشی null بودن را چک کرد و چالش اصلی اطمینان از کامپایلر برای انتخاب روش دقیق برای چک کردن آن است.


دستورات using و async/await
دستور using روشی برای اطمینان از استفاده از اشیا در ناحیه خود است. طرح پیشنهادی جدید به سادگی این موضوع را به متدهای async ارتباط می دهد. اکنون می توان چنین چیزی را نوشت:


Using (MyClassmyClass=new MyClass())
{
Do something with myClass
}


در اینجا می توان اطمینان داشت که myClass تا پایان کلاس عمر دارد. طرح جدید به using در داخل متد async اجازه می دهد تا منابع را به صورت خودکار و همزمان ایجاد کند.
چندین ایده جالب توجه در قسمت “Some interest” وجود دارد، ولی 18 طرح پیشنهادی متفاوت در آنها هست که برای توضیح دادن نیاز به زمان زیادی است. دو مورد آنها List و dictionaries می باشند که در مرکز زبان قرار دارند.
در طرف دیگر چندین مورد از قسمت "کوچک اما کاربردی" هستند که نسبتا آسان هم می باشند:
-    متدهای extension در کلاس های non-static
-    محدودیت های عمومی، استاتیک در مقابل نمونه ها
-    پارامترها
-    IEnumerable
-    لیترال های دودویی
-    جداکننده های رقمی
به نظر می رسد که بهتر است # c  را رها کرد و تنها از ویژگی هایی استفاده کرد که واقعا لازم باشد. # C  در حال حاضر به سمت برنامه نویسی تابعی پیش می رود که به نظر جذاب هم می رسد ولی در این صورت ما چرا # F را داریم؟

دیگر اخبار نویسنده

ارسال نظر


شخصی سازی Close
شما در این صفحه قادر به شخصی سازی نمیباشید