استفاده از 6 #c در ASP.Net 5

جمعه 7 اسفند 1394

در این مقاله میخواهیم درمورد c# 6 و ویژگی های آن در ASP.NET 5 صحبت کنیم.ما میخواهیم از دستور زبان و قوانین موجود در ASP.NET 5 استفاده کنیم و توضیح خواهیم داد که شما چگونه میتوانید از ویژگیهای C# 6 در نرم افزارهای ASP.NET 5 استفاده کنید تا اگر یک تیم از برنامه نویسان هستید که در حال کار بر روی یک پروژه ی واحد هستید بتوانید فرایندی بهتر،اجرایی کارآمد و خواناتر داشته باشید.

استفاده از 6 #c در ASP.Net 5

مواردی که در این مقاله قصد داریم که به شما آموزش دهیم:

ASP.NET 5: در این زمینه توضیحات خیلی ابتدایی نیستند اما در سطحی هستند که افراد مبتدی قادر به درک آن باشند.

C# 6 feartures(ویژگیهای C#6): در مقاله های قبلی درمورد آن بحث شده است.

چگونه میتوانیم اجرای نرم افزار تحت وب خود را بهبود ببخشیم:

استفاده از ویژگیهای C# 6 در ASP.NET

چیزی که ما در ASP.NET داریم فقط یک فریم ورک برای ساختن نرم افزارهای تحت وب است و C# هم یک زبان برنامه نویسی برای برنامه نویسیapplicationها میباشد.هر چقدر که نرم افزار شما بهتر اجرا شود برنامه ی شما روان تر و کارآمدتر محسوب میشود.C# 6 اخرین نسخه از زبان برنامه نویسی C#است و از کامپایلر Roslyn استفاده میکند.البته شما میتوانید از این زبان در نسخه قبلی ASP.NETنیز مثل ASP.NET 4.5. نیز استفاده کنید.

ASP.NET

ASP.NET بخودی خود بسیار سازگار و مناسب است اما  با استفاده از قدرتC# 6 ، شما قدرت سازگاری آن رامیتوانید بهتر ازآنچه که هست بکنید.در این مقاله میخواهیم چند متد به شما نشان دهم که میتوانید در آن از C# 6 استفاده کنید.در این مقاله ابتدا کاربرد کدها در قالب نرم افزارهای تحت وب ASP.NET توضیح داده خواهند شد و تنها به به جنبه ی برنامه نویسی با C# آن بسنده نخواهد شد.

String interpolation

اکنون میخواهیم رشته هایی با استفاده از داده ای پویا، از طرف کاربران بسازیم.ما به شما پیشنهاد میکنیم که آنها را با استفاده از درج رشته(string interpolation)  بنویسید.

1.  var message = $"Hello {Username}, you have {count} unread messages.";  

  

3.  // Then you can use this value in views, or back-end model management, or in HTML  

<p>@message</p>

 

 با این روش ،شما مجبور نخواهید بود یک نمونه شی string یا یک string builder تعریف کنید.این متد همان کاری که تابع string.Format()  انجام میدهد را میتواند خیلی بهتر انجام دهد.یک مثال جهانی از کاربرد این قابلیت این است که ASP.NET یک اینترفیس آماده کرده است که شمامیتوانید از آن برای راه اندازی اعلانهای  ایمیل و اس ام اس استفاده کنید.در حالیکه شما قبلا  مجبور بودید برای نوشتن از کد زیر استفاده کنید.

var message = string.Format("Hello, {0}! Use {1} as your code to activate the service.", username, token);  
  
// Send the code through SMS or email services  

  

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

var message = $"Hello {username}! Use {token} as your code to activate the service";

این یک روش بسیار کوتاه  برای ساختن رشته هاست و همیشه از آن میتوان به جای تابع  string.Format استفاده کرد.

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

1.  try  

{  

3.      // Code that may raise exception.  

} catch (Exception er)   

5.  {  

    if (er is NullReferenceException)  

7.      {  

        // Log this null error  

9.      } else   

    {  

11.         // Chain the exceptions or just leave...  

    }  

13. }  

 

این کدها چه هستند؟در این کدها شما وارد یک catch block میشوید سپس شما داخل این catch block شرایطی که میخواهید را بررسی میکنید. در c# 6 شما میتوانید این قطعه کد را خواناتر بنویسید.شما قطعه کد بالا را میتوانید به صورت زیر تغییر دهید:

 

try  
{  
    // Code that may raise exception.  
} catch (Exception e) when(e is NullReferenceException)  
{  
    // Execute this block in case the error was "null" reference.  
} catch (Exception e) when(e is UnauthorizedAccessException)  
{  
    // Execute this in case the exception was this one..  
}  
  
// You can chain the exception conditions...  

به این ترتیب، شما میتوانید انتشار استثنائات رادر بلاک exception برگردانید در این صورت دیگر خطا در اخر کارتان وجود نخواهد داشت و شرایطی که باعث ایجاد خطا شده است را در exception  اول بررسی میکنید، اگر درexception  اول شرایط مورد نظر اتفاق نیفتاد به عبارت بعدی میرود و شرایط پیش آمده در عبارت بعدی بررسی میشود.در واقع شما میتوانید با این زبان جدید استثنائات را فیلتر کنید.

name of operator

فکر میکنم در محیط asp.net متغیرها بیشترین کاربرد را دارند. بیشتر اوقات برنامه نویسان باید متغیرهایی "حدس بزنند" و سپس از آن متغیر در کدهای خود استفاده کنند.برای مثال به کد زیر دقت کنید:

 

string name = null;  
  
// Now when you will call any function on name,  
// it would raise exception. Like:  
int length = name.Length;  
  
// Before C# 6, you would do:  
// inside catch block  
var message = "Sorry, name was null.";  

این کد مشکلی ندارد و همه چیز در مورد آن درست است... اما اگر بخواهید که نام متغیرها راتغییر دهید چطور؟ آیا همه چیز به خوبی پیش خواهد رفت؟حتی اگر این تغییر نام، تاثیری روی خروجی شما نداشته باشد شما خواستار این هستید که از جزئیات در محیط برنامه نویسی خود استفاده کنید.چیزی که شما میخواهید انجامش شود این است که تغییری که در رشته بالا انجام میشود در کل سیستم نیز نشان داده شود.

C# 6 از این خواسته ی شما پیشتیبانی میکند.و شما با استفاده از این زبان قادر خواهید بود متغیری که در کدتان دارای مشکل است را شناسایی کنید 

string name = null;  
  
int length = name.Length;  
  
var message = $ "Sorry, {nameof(name)} is null.";  

 

قطعه کد بالا همان کدقبلی است. پس تفاوت در کجاست؟ تفاوت در این است که اکنون شما میتوانید متغیرها را تغییر دهید و دستکاری کنید.قبلا شما با تغییر متغیرها  مجبور بودید که String را نیز ویرایش کنید.اما اکنون هنگامیکه نام متغیرها را تغییر میدهید این تغییر نام در سراسر برنامه تغییر خواهد کرد و عملگر nameof()   نام تغییر یافته ی متغیرها را  برمیگرداند. همچنین اگر شما میخواهید که یک مدل و نمونه بسازید و سپس آنرا اجرا کنید...

class Model  
{  
    public string Name   
    {  
        get;  
        set;  
    }  
    public string Email  
    {  
        get;  
        set;  
    }  
}  
  
// You could do this:  
var message = $ "{nameof(Email)}: {Name}, {nameof(Email)}: {Email}"; 

15. // You could do this:  

var message = $ "{nameof(Email)}: {Name}, {nameof(Email)}: {Email}";  

استفاده از تمام قدرت C# 6


Null conditional operator

در بیشتر مواردی، اکثر مبتدیان معمولا در “NullReferenceException” دچار مشکل میشوند.بهر حال این خطا در بسیاری از موارد یک خطای بسیار کاربردی است و من به شما پیشنهاد میکنم که با این خطا کنار بیایید زیرا این خطا در بسیاری از موارد به شما بسیار کمک خواهد کرد.

 معمولا شما خطاهایی که شی با مقدار null برمیگرداند را نادیده میگیرید.اگر قسمت ضمیمه ای که همراه با این خطاها وجود دارد را باز کنید درخواهید یافت که نام متغیرها و اشیاء در هنگام اجرا null است ودر این موارد، #c یک exception ایجاد نمیکند و درعوض یک مقدار null ذخیره میکیند.

string message = null;  
  
var length = message?.Length;  

  

در حالت قبلی یک exception ایجاد میشد.در این حالت هیچ exception وجود ندارد. اما یک نوع exception وجود دارد که در این مورد میتوان از آن استفاده کرد.که در مورد این exception قبلا صحبت کردیم.نکته ای که اینجا وجود دارد این است که متغیر  "length" شما هم در اینجا null خواهد شد،بنابراین شما برای استفاده از این متغیر یک خطای دیگر به برنامه اضافه کرده اید مگر اینکه شرایطی مشابه را override کنید.

Auto-properties

در aSP.NET مدلها و نمونه ها معمولا ساختارها هستند.شما هیچ مقدار پیش فرضی در آنها ندارید،اما اگر بخواهید ساختارتان را به گونه ای طراحی کنید که یک مقدار پیش فرض را در خود نگه دارد تا وقتی کاربر فرم را باز کرد ان مقدار نمایش داده شود شما باید به این شکل عمل کنید:

class SomeForm  
{  
    public string Name   
    {  
        get;  
        set;  
    } = "Your name.";  
    public string Email   
    {  
        get;  
        set;  
    } = "youraddress@example.com";  
    public string Message   
    {  
        get;  
        set;  
    } = "Enter your message here.";  
}  

 

شما اگر بخواهید کد بالا را به عنوان یک المان اجرا کنید باید آنها را بوسیله ی یک مقدار پیش فرض بگیرید.معمولا شما آنها را وارد HTML،  hardcoded فرم میکنید.

 به جای این کار شما میتوانید یک ثابت بگیرید و ان را از مدلتان جدا کنید تا اگر نیاز بود از مدلتان بتوانید بعدها هم استفاده کنید.

همچنین شما میتوانید یک property  فقط خواندنی(getter) تعریف کنید.این property  فقط خواندنی با روشی مشابه میتواند مقداردهی اولیه شود.

1.  public Helpers  

{  

3.      public static string SMTP   

    {  

5.          get;  

    } = "smtp.example.com";  

7.  }  

به این ترتیب شما میتواند مقدار مورد نظر را در یک خط کد مدیریت کنید بدون اینکه نیاز باشد که از یک constructor برای مقداردهی اولیه استفاده کنید.

Lambda استفاده از 

اگر string interpolation نباشد پیشنهاد بعدی من استفاده از عبارات lambda است. این عبارات از بخش توابع برنامه نویسی نشئت میگیرند و مزیت آنها این است که هیچ اثر جانبی ندارند.منظور من این است که تابع مقادیر را ارزیابی میکند و سپس مقادیربرگردانده میشوند به جای اینکه یک stack  برای تابع ایجاد شود.

public Helpers  
{  
    public static string SMTP   
    {  
        get;  
    } = "smtp.example.com";  
}  

 

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

public int Multiply(int a, int b)  
{  
    return a * b;  
}  

;  

این روش نوشتن کد، دو مزیت دارد:

1.کد خواناتر بنظر میرسد.

2. هیچ stack  ای وجود نخواهد داشت.

کد ارزیابی و بررسی میشود و مقدار مربوطه برگردانده میشود.

نه تنها این روش خوانایی کد را بالا میبرد بلکه سرعت اجرای کد را نیز بهبود میدهد! شما میتوانید مطلب گفته شده را آزمایش کنید  و با آن کار کنید تا تفاوت را بهتر درک کنید.

مزیت دیگر استفاده از lambdas در propertyهایی فقط خواندنی(فقط get  دارند) این است که به صورت خودکار در هنگام تعریف property  با این خصوصیت ایجاد میشود. نسخه های قدیمی property ها  همیشه به فیلد برگشتی بستگی داشتند. این فیلدها وجود داشتند تا مقادیر فرستاده یا گرفته شوند.این کار باعث میشد که فراخوانی اضافی برای فیلدهای اضافی انجام شود،.چه چیزی که lambda دارد این است که شما میتوانید یک فیلد را مانند یک lambda بنویسید.همانطور که میدانید عبارات lambda با فیلدهای دیگر کار نمیکند به این ترتیب lambda به ما کمک میکند تا با روش خیلی بهتری فیلدهای readonly بسازیم.برای مثال اگر شما یک property ماند کد زیر بسازید:

public int Multiply (int b, int b) => a * b;  

 

اتفاقی که می افتد بوجود آمدن یک فیلد برگشتی است، سپس این مقدار در یک فیلد برگشتی ذخیره میشود. از این به بعد هر زمان که بخواهید این property  را صدا را بزنید، یک فیلد برگشتی را برای گرفتن  آن مقدار صدا میزند.فراخوانی بعدی ایجاد خواهد شد.

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

 

public string Name { get; } = "Afzaal Ahmad Zeeshan";  

این کار یک مزیت دارد و آن اینکه:

1.تا زمانیکه این یک property از نوع readonly است :

_ نیاز به update ندارد

_شما یک مقدار پیش فرض برای آن آماده میکنید.

_شما مانند یک فیلد ثابت با آن رفتار میکنید.

2.کدها خواناتر خواهند شد.

Lambadas نه تنها توابع و متدهای شما را بهتر میکند بلکه property های(redonly) شما را نیز  بهتر میکند.از نظر فنی، شما میتوانید اجرای نرم افزارتان را بهبود بدهید.

نکات موردتوجه 

من تا کنون تمام ویژگی هایی که در c# 6 وجود دارد تحت پوشش قرار ندادم و به شما توضیح ندادم ، چرا؟ بدلیل اینکه بیشتر آنها توسط برنامه نویسان با سطح متوسط  استفاده نمیشود و تنها بخشی از برنامه نویسان از آنها استفاده میکنند. تعدادی از این موارد در زیر لیست شده است.

1.اندیس گذاری اولیه در ‏دیکشنری

2.سازنده بدون پارامتر از نوع ساختار

3. و غیره

با اینکه در این مقاله شما متوجه شدید که چگونه از ویژگی های موجود در c# 6  در applicationهای تحت وب  در ASP.NET استفاده کنید اما شما چیزی برای بهبود کدهایتان از لحاظ syntax نیاموختید،اما در عوض اجرای application ها با خواندن این مقاله بهبود خواهد یافت.

مابه شما پیشنهاد میکنیم که موارد زیر را حتما در پروژه تان لحاظ کنید.

String interpolation  

_باعث میشود که رشته (string) شما خواناتر شود.

_ قالب string شما راحت تر ویرایش میشود.

_ترجمه به متدی بهتر برای تولید رشته ها

 

2.عبارات lambda

وجود عبارات lambda توابع شما را کارآمدتر خواهد کرد.

_ Property هایی که به طور خودکار، به عنوان  فقط خواندنی ایجاد میشوند مانند یک فیلد ثابت رفتار میکنند.

_ این property ها بسیار خوانا هستند.

 

اینها چند توصیه برای کسانی بود که از کامپایلر Roslyn استفاده میکنند و میخواهند که از زبان c# 6  استفاده کنند.

برنامه نویسان

نویسنده 3355 مقاله در برنامه نویسان

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

در صورتی که در رابطه با این مقاله سوالی دارید، در تاپیک های انجمن مطرح کنید