ویژگی‌های جدید در C# 6 - بخش دوم

در صورتی که بخش اول این مجموعه را مطالعه نکرده‌اید، پیشنهاد می‌کنم ابتدا بخش اول را مطالعه کنید:

ویژگی‌های جدید در C# 6 - بخش اول

ادامه بحث:

۵. فیلترکردن Exceptionها

این امکان در VB و #F موجود بوده است. همکنون این ویژگی برای #C نیز اضافه شده است:

try { … }
catch (MyException e) if (myfilter(e))
{
        //…
}

در صورتی که عبارت داخل پرانتز به true ارزیابی شود، بلوک catch اجرا خواهد شد وگرنه Exception نادیده گرفته می‌شود.

یکی از کاربردهای آن می‌تواند زمان log کردن خطا باشد. به این صورت که در صورتی که خطا log شده بودن بخش catch اجرا شود. می‌توان این سناریو را خودکار کرد:

private static bool Log(Exception e) { /* اطلاعات را لاگ کنید */ ; return true; }
…
try { … } catch (Exception e) if (Log(e)) {}

۶. تعریف عبارت‌ها

گاهی تعریف متغیرها وقت‌گیراست و به شکل یک کاراضافه نمود پیدا می‌کند. یکی از مواقع هنگام استفاده از دستور TryParse است. با استفاده از قابلیت جدید C# می‌توان متغیرهای محلی را(با initializer یا بدون آن) وسط عبارات تعریف کرد. به مثال‌های زیر توجه کنید:

if (int.TryParse(s, out int i)) { … }
GetInfo(out var x, out var y);
Console.WriteLine("Result: {0}", (int x = GetValue()) * x); 
if ((string s = o as string) != null) { … s … }

همانطور که بیان شد این قابلیت به‌خصوص هنگام استفاده از out به کار خواهد آمد و دیگر نیازی به تعریف متغیر محلی در یک خط جدا وجود ندارد.

۷. عملگرهای Null Conditional

گاهی نیاز است که بررسی‌هایی از جهت Null نبودن، روی کد انجام شود. عملگر Null-Conditional به شما این امکان را خواهد داد تا فقط زمانی به اعضای یک شی دسترسی داشته باشید که آن شی Null نباشد. در صورت Null بودن شی والد تنها یک نتیجه Null برگشت داده خواهد شد و نه یک Exception که موجب خطای زمان اجرا گردد:

int? length = customers?.Length; // null if customers is null
Customer first = customers?[0]; // null if customers is null

همچنین می‌توان این عملگر را با عملگر ترکیبی Null بودن (C# (null coalescing operator همزمان استفاده کرد:

int length = customers?.Length ?? 0; // 0 if customers is null

عملگر Null Conditional عملیاتی مشابه اتصال کوتاه (Short Circuiting) را شبیه‌سازی می‌کند. به این‌صورت که یک زنجیره از اعضا و فراخوان‌های نوشته شده پس از علامت ؟ تنها زمانی اجرا می‌شوند که شی والد Null نباشد:

int? first = customers?[0].Orders.Count();

این کد دقیقا مشابه کد زیر است:

int? first = (customers != null) ? customers[0].Orders.Count() : null;

به غیر از شی customer که پیش از همه محاسبه می‌شود، هیچ‌کدام از اعضا، فراخوان‌هایی که بلافاصله پس از علامت ؟ آمده‌اند تا زمانی که شی customer، null باشد اجرا نخواهند شد.

همچنین می‌توان این عملگر‌ها را نیز به صورت یک زنجیره متوالی استفاده نمود:

int? first = customers?[0].Orders?.Count();

۸. استفاده از await در بلاک catch و finally

در C# 5 امکان استفاده از کلمه‌کلیدی await در بلاک catch و یا finally وجود نداشت همچنین به‌نظر می‌رسید امکان پیاده‌سازی آن نیز هیچ‌گاه وجود نداشته باشد. اما الان متوجه می‌شویم هیچ چیزی غیر ممکن نیست حتی خود غیرممکن (!):

Resource res = null;
try
{
       res = await Resource.OpenAsync(…); //قبلا این کد را می‌توانستیم فقط داشته باشیم
…
} 
catch(ResourceException e)
{
       await Resource.LogAsync(res, e); // همکنون می‌توان این کد را نوشت
}
finally
{
       if (res != null) await res.CloseAsync(); // و این کد را
}

کلیه مطالب ارائه شده در این دو پست براساس اطلاعات ارائه شده در وب جمع‌آوری شده است و تا پیش از ارائه رسمی C# 6 نمی‌توان با قاطعیت در مورد وجود و یا عدم وجود آنها در نگارش بعدی بحث کرد. حتی ممکن است برخی از این ویژگی‌ها با صلاحدید مایکروسافت تغییر کنند و یا به‌طور کاملا حذف شوند.

  • Book.mark.hu
  • co.mments
  • De.lirio.us
  • del.icio.us
  • Digg
  • DotNetKicks
  • E-Mail
  • Facebook
  • feedmelinks
  • Google
  • LinkedIn
  • msdn Social
  • MyShare
  • Slashdot
  • StumbleUpon
  • TwitThis
  • Tumblr
  • Yahoo! Buzz
  • Yahoo! MyWeb
  • Print
امکان ارسال نظر برای این موضوع وجود ندارد