اندازهی قلم متن
تخمین مدت زمان مطالعهی مطلب:
دو دقیقه
در طراحی زبان #C، واژهی کلیدی throw همیشه یک statement بودهاست و نه یک expression. برای مثال از آن نمیتوان در قطعه کدهای شرطی و عبارات lambda استفاده کرد. برای رفع این محدودیت، در C# 7 کار معرفی «throw expressions» صورت گرفتهاست.
throw expressions در C# 7
روش تعریف throw expressions همانند روش متداول تعریف آنها است و از این لحاظ تغییری صورت نگرفتهاست. تنها تغییر انجام شده، امکان استفادهی از آن در محلهایی است که پیشتر مجاز نبودهاست.
برای نمونه قطعه کد متداول ذیل را درنظر بگیرید:
در اینجا با روش fail fast، کار بررسی null بودن مقادیر دریافتی در سازنده و همچنین یک خاصیت، صورت گرفتهاند و در صورت نال بودن، یک استثناء صادر میشود.
اکنون در C# 7 میتوان قطعه کد فوق را به صورت ذیل خلاصه کرد:
از این جهت که واژهی کلیدی throw در C#7 هم statement است و هم expression، اکنون میتوان از آن در عبارات شرطی و همچنین null-coalescing expressions نیز استفاده کرد. به علاوه امکان استفادهی از آنرا در یک «initialization expression» مانند loadedResource_ نیز مشاهده میکنید.
به علاوه اگر نکات «Expression-bodied Members» را نیز اعمال کنیم، اینبار به قطعه کد خلاصهتر ذیل خواهیم رسید:
یک مثال ترکیبی دیگر
قطعا تا پیش از C# 7 یک چنین بررسیهای شرطی را در حین تزریق وابستگیها، در سازندهی کلاسهای سرویس خود انجام دادهاید:
اکنون در C# 7 میتوان قطعه کد فوق را به صورت ذیل خلاصه کرد:
که ترکیبی است از throw expressions و همچنین Expression-bodied Members.
مثالی از کاربرد throw expressions در یک conditional ternary operator
مثالهایی را که تا اینجا بررسی کردیم بیشتر به null-coalescing expressions مرتبط بودند. در اینجا یک نمونه کاربرد throw expression را در یک conditional ternary operator مشاهده میکنید.
throw expressions در C# 7
روش تعریف throw expressions همانند روش متداول تعریف آنها است و از این لحاظ تغییری صورت نگرفتهاست. تنها تغییر انجام شده، امکان استفادهی از آن در محلهایی است که پیشتر مجاز نبودهاست.
برای نمونه قطعه کد متداول ذیل را درنظر بگیرید:
public class MyApiType { private object _loadedResource; private object _someProperty; public MyApiType() { _loadedResource = LoadResource(); if (_loadedResource == null) throw new InvalidOperationException(); } public object SomeProperty { get { return _someProperty; } set { if (value == null) throw new ArgumentNullException(); _someProperty = value; } } }
اکنون در C# 7 میتوان قطعه کد فوق را به صورت ذیل خلاصه کرد:
public class MyApiType { private object _loadedResource = LoadResource() ?? throw new InvalidOperationException(); private object _someProperty; public object SomeProperty { get { return _someProperty; } set { _someProperty = value ?? throw new ArgumentNullException(); } } }
به علاوه اگر نکات «Expression-bodied Members» را نیز اعمال کنیم، اینبار به قطعه کد خلاصهتر ذیل خواهیم رسید:
public class MyApiType { private object _loadedResource = LoadResource() ?? throw new InvalidOperationException(); private object _someProperty; public object SomeProperty { get => _someProperty; set => _someProperty = value ?? throw new ArgumentNullException(); } }
یک مثال ترکیبی دیگر
قطعا تا پیش از C# 7 یک چنین بررسیهای شرطی را در حین تزریق وابستگیها، در سازندهی کلاسهای سرویس خود انجام دادهاید:
public partial class ShippingAddressPage { private readonly IWebDriver driver; public ShippingAddressPage(IWebDriver driver) { if (driver == null) { throw new ArgumentNullException(nameof(driver)); } this.driver = driver; } }
public partial class ShippingAddressPage { private readonly IWebDriver driver; public ShippingAddressPage(IWebDriver driver) => this.driver = driver ?? throw new ArgumentNullException(nameof(driver)); }
مثالی از کاربرد throw expressions در یک conditional ternary operator
private static int ThrowUsageInAnExpression(int value = 40) { return value < 20 ? value : throw new ArgumentOutOfRangeException("Argument value must be less than 20"); }