معرفی Roslyn

بسم الله الرحمن الرحیم

معرفی Roslyn

همانطور که می دانید مایکروسافت کامپایلر جدیدی را با عنوان Roslyn (رازلین خوانده می شود) معرفی کرده است. Roslyn به همراه Visual Studio 2015 ارائه شد. شما می توانید در تمامی پروژه هایی که توسط ویژوال استادیو 2015 ایجاد می کنید از این کامپایلر استفاده کنید. این کامپایلر امکانات بسیار زیادی را در اختیار شما قرار می دهد و باعث کاهش حجم کد نویسی خواهد شد و همچنین بسیاری از خطاهای معمول را می توانید توسط این کامپایلر کنترل کنید که طبیعتا باعث افزایش سرعت تولید می گردد.

 

Rosyln

کامپایلر جدید مایکروسافت که به صورت وب سرویس قابل دسترسی است. این کامپایلرopen Source می باشد.


در صورتی که تمایل داشته باشید این کامپایلر را بر روی نسخه های قدیمی تر Visual Studio مانند ویژوال استادیو 2013 نصب کنید می توانید از طریق دستورات Nuget این کامپایلر را بر روی پروژه ی خود نصب کنید.


https://www.nuget.org/packages/Microsoft.Net.Compilers

در صورتی که از Visual Studio 2015 استفاده می کنید نیازی به نسب این package نیست.


قابلیت های مربوط به کامپایلر Roslyn که با C# 6 شناخته می شود که در این آموزش این امکانات را برای شما معرفی خواهیم کرد.

یکی از بزرگترین مشکلات و خطاهایی که در برنامه ها رخ می دهد، خطاهای مربوط NULL بودن Object ها و متغییرها می باشد، به همین دلیل شما می بایست قبل از استفاده از هر object یا متغییری ابتدا مقدار آن را چک کنید.


public static string CustomeSubString(string value, int length)
{
  string result = value;
  if (value != null) /* Skip empty string check for elucidation*/
  {
    result = value.Substring(0, length);
  }
  return result;
}


در C# 6 و به همراه Roslyn ویژگی اضافه شده است که توسط آن می توانید به سادگی مقادیر Object ها و متغییرها را پیش از استفاده چک کنید تا خطاهای NULL دیگر رخ ندهند.


public static string CustomeSubString(string value, int length)
{          
  return value?.Substring(0, length);
}

همانطور که در خط بالا مشاهده می کنیدف شما به سادگی می توانید با یک ? مقادیر را چک کنید تا از خطاهای NULL در برنامه جلوگیری شود.

در نظر داشته باشید وقتی که توسط عملگر ? یک مقدار را بررسی می کند، اگر مقدار مورد نظر NULL باشد خروجی این عملگر نیز NULL خواهد بود. در نتیجه باید برای دریافت خروجی این عملگر متغییر ها را به صورت Nullable ایجاد کنید.


int length = text?.Length; // Compile Error: Cannot implicitly convert type 'int?' to 'int'

برای رفع این مشکل کافی است که متغییر خود را به صورت Nullable تعریف کنید.


int? length = text?.Length;


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


public Class Roslyn
{
  public long? Id { get; set; }
  public string Name { get; set; }
}

اگر شیی از این کلاس را به صورت زیر ایجاد کرده باشیم و بخواهیم مقدار Id آن را نمایش دهیم باید بررسی کنیم که ابتدا این شی NULL نیست و سپس مقدار ID آن نیز NULL نباشد.


private void RoslynMethod()
{
    Roslyn roslyn = new Roslyn();
    /* get value and fill roslyn */

    if (roslyn != null)
    {
        if (roslyn.Id != null)
        {
            string roslynID = roslyn.Id.ToString();
        }
        if (string.IsNullOrEmpty(roslyn.Name))
        {
            string roslynName = roslyn.Name.ToString();
        }
    }
}

حال اگر بخواهیم همین کدهای بالا را با استفاده از ویژگی جدید سی شارپ 6 و کامپایلر جدید مایکروسافت Roslyn پیاده سازی کنیم کد ما به صورت زیر خواهد بود.

string roslynName = roslyn.Name?.ToString();
string roslynID = roslyn.Id?.ToString();


یکی از دیگر قابلیت های عملگر ? برای بررسی مقادیر پیش از انتساب دادن می باشد، عملگر ?? به شما اجازه می دهد تا تعیین کنید در صورتی که مقدار یک Object برابر با NULL بود، به جای مقدار NULL چه مقدار بازگشت داده شود.

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


string roslynName = roslyn.Name.ToString() ?? "NULL!!";
string roslynID = roslyn.Id.ToString() ?? "NULL!!";

Auto-Property Initializers

قابلیت دیگری که در سی شارپ 6 و کامپایلر جدید مایکروسافت Roslyn وجود دارد، امکان انتساب مقادیر پیش فرض به پراپرتی ها می باشد. کلاس مثال قبل را با استفاده از همین خاصیت بازنویسی می کنیم.


 public class Roslyn
 {
     public long? Id { get; set; } = 1;
     public string Name { get; set; } = "Roslyn Name!";
 }

Expression Bodied Methods

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


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

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

String Interpolation

یکی از روش هایی که برای استفاده از متغییرها در  میان عبارات رشته ای مورد استفاده قرار می گیرد استفاده از قابلیت String.Format می باشد.


var result = String.Format("your name is {0} and your id is {1}", roslyn.Name, roslyn.Id);

یکی دیگر از قابلیت های سی شارپ 6 و کامپایلر جدید مایکروسافت Roslyn استفاده از نام Object و متغییرها به جای Index و اعداد در میان عبارت های رشته ای (String.Format) می باشد. شما می توانید به دو روش این کار را انجام دهید.


var result = "your name is \{roslyn.Name} and your id is \{roslyn.Id}";

در روش بالا کافی است از {Object}\ استفاده کنید، در اینجا کافی است به جای نام object نام متغییر و یا نام شی خود را بنویسید. همچنین شما می تواند از روش های فرمت دهی که در String.Format استفاده می کردید در اینجا نیز استفاده کنید.


var result = "your name is \{roslyn.Name,20} and your id is \{roslyn.Id:D3}";

علاوه بر این موارد شما می توانید به سادگی در میان عبارات رشته ای خود دستورات سی شارپ بنویسید.


var result = "your name is \{roslyn.Name} and your id is \{roslyn.Id} \{(roslyn.Id == 1 ? "" : "s")} ";

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


var result = $"your name is {roslyn.Name,20} and your id is {roslyn.Id:D3}";

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

Exception Filters

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


public async void Process()
{
   try
   {
      DataProcessor processor = ne
   }
   /* Catches and handles only non sql exceptions */
   catch (Exception exception) if(exception.GetType()
      != typeof(SqlException))
   {
      ExceptionLogger logger = new ExceptionLogger();
      logger.HandleException(exception);
   }
}

استفاده از  Await در بدنه Catch

در سی شارپ 6 و کامپایلر جدید مایکروسافت Roslyn شما می توانید از دستور await در بدنه Catch نیز استفاده کنید.


public async void Process()
{
   try
   {
      Processor processor = new Processor();
      await processor.ProccessAsync();
   }
   catch (Exception exception)
   {
      ExceptionLogger logger = new ExceptionLogger();
      /* Catch operation also can be aync now!! */
      await logger.HandleExceptionAsync(exception);
   }
}

تعریف پارامتر با نوع OUT در زمان فراخوانی توابع

شما می توانید در زمان استفاده از یک متغییر OUT همان جا متغییر خود را تعریف کنید.


public bool ConvertToIntegerAndCheckForGreaterThan10
   (string value)
{
   if (int.TryParse(value, out int convertedValue)
      && convertedValue > 10)
   {
      return true;
   }

   return false;
}

Primary Constructor

Primary Constructor به شما اجازه می دهد پارامترهای مربوط به متد سازنده کلاس خود را تعریف کنید. Primary Constructor فقط در سطح کلاس و در زمان مقدار دهی کلاس، مورد استفاده قرار می گیرد. زمانی که از Auto-Property initializers استفاده می کنید این ویژگی می تواند به شما کمک بسیار زیادی کند.


/* Primary constructor */
class Basket(string item, int price)
{
   /* Using primary constructor parameter values
   * to do auto property initialization.*/
   public string Item { get; } = item;
   public int Price { get; } = price;
}

نظرات (۲)

خیلی ممنون
جالب بود.
ممنون
ارسال نظر آزاد است، اما اگر قبلا در بیان ثبت نام کرده اید می توانید ابتدا وارد شوید.
شما میتوانید از این تگهای html استفاده کنید:
<b> یا <strong>، <em> یا <i>، <u>، <strike> یا <s>، <sup>، <sub>، <blockquote>، <code>، <pre>، <hr>، <br>، <p>، <a href="" title="">، <span style="">، <div align="">
تجدید کد امنیتی