مطالب
C# 7 - Throw Expressions
در طراحی زبان #C، واژه‌ی کلیدی throw همیشه یک statement بوده‌است و نه یک expression. برای مثال از آن نمی‌توان در قطعه کدهای شرطی و عبارات lambda استفاده کرد. برای رفع این محدودیت، در C# 7 کار معرفی «throw expressions» صورت گرفته‌است.


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;
        }
    }
}
در اینجا با روش fail fast، کار بررسی null بودن مقادیر دریافتی در سازنده و همچنین یک خاصیت، صورت گرفته‌اند و در صورت نال بودن، یک استثناء صادر می‌شود.
اکنون در 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();
        }
    }
}
از این جهت که واژه‌ی کلیدی throw در C#7 هم statement است و هم expression، اکنون می‌توان از آن در عبارات شرطی و همچنین null-coalescing expressions نیز استفاده کرد. به علاوه امکان استفاده‌ی از آن‌را در یک «initialization expression» مانند loadedResource_ نیز مشاهده می‌کنید.

به علاوه اگر نکات «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;
    }
}
اکنون در C# 7 می‌توان قطعه کد فوق را به صورت ذیل خلاصه کرد:
public partial class ShippingAddressPage
{
    private readonly IWebDriver driver;
    public ShippingAddressPage(IWebDriver driver) =>
      this.driver = driver ?? throw new ArgumentNullException(nameof(driver));
}
که ترکیبی است از throw expressions و همچنین Expression-bodied Members.


مثالی از کاربرد 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");
}
مثال‌هایی را که تا اینجا بررسی کردیم بیشتر به null-coalescing expressions مرتبط بودند. در اینجا یک نمونه کاربرد throw expression را در یک conditional ternary operator مشاهده می‌کنید.
نظرات مطالب
روش‌هایی برای بهبود سرعت برنامه‌های مبتنی بر Entity framework
زمان انتقال به یک صفحه دیگر، ربطی به EFInteractiveViews که فقط یکبار در آغاز برنامه اجرا و کش می‌شود ندارد. نیاز به پروفایل کردن پروژه، و لاگ کردن خطاها و مشکلات دارید. همچنین لاگ کردن خطاهای EF را هم مدنظر داشته باشید. به علاوه ابزارهایی مانند Glimpse هم برای کار شما مفید هستند.
بازخوردهای دوره
تزریق خودکار وابستگی‌ها در ASP.NET Web API به همراه رها سازی خودکار منابع IDisposable
- کدهای به روز شده‌ی این سری در مخزن کد آن قرار دارند. ObjectFactory مخصوص نگارش 3 آن بوده که در نگارش 4 حذف شده‌است. به همین جهت SmObjectFactory تهیه شده‌است.
- context را باید از طریق الگوی واحد کار مورد استفاده قرار داد (و تفاوتی هم نمی‌کند که چه نوع پروژه‌ای باشد؛ اصول آن یکی است).
بازخوردهای دوره
تزریق وابستگی‌ها در فیلترهای ASP.NET MVC
ضمن تشکر ویژه از توجه شما، بله، از فایلهای همین مخزن استفاده کردم. در اینجا هم همان Attribute کامنت شده است. با حذف آن، مجددا همان پیام را دریافت می‌کنم. مگر مطابق با این قطعه کد:
        public LogAttribute(IContainer container)
        {
            _container = container;
        }
استفاده از این Attribute نیازمند پارامتر ورودی IContainer نیست؟
لطف می‌کنید راهنمایی بفرمایید.
اشتراک‌ها
ترجمه کتاب Learning Ionic به زبان فارسی

ترجمه کتاب Learning Ionic به زبان فارسی برای اولین بار (تنها مرجع فارسی)

 یاد بگیرید که چگونه می‌توان با تکنولوژی‌های سمت کاربر وب برنامه‌های موبایل برای تمام پلتفرم‌های موجود بسازید.

برای دانلود و همکاری در ترجمه به مخزن کد پروژه مراجعه کنید.

 

ترجمه کتاب Learning Ionic به زبان فارسی
نظرات مطالب
امن سازی برنامه‌های ASP.NET Core توسط IdentityServer 4x - قسمت اول - نیاز به تامین کننده‌ی هویت مرکزی
جهت اطلاع
این سری برای ASP.NET Core 2x تهیه شد و با آخرین نگارش Identity server و همچنین ASP.NET Core سازگار نیست. برای اعمال آخرین تغییرات مورد نیاز این دو، تمام قسمت‌های این سری باید بازنویسی کلی شوند که ... خارج است از امکانات ما. به همین جهت مخزن کد آن در حالت آرشیو قرار گرفته تا این موضوع مشخص باشد.
نظرات مطالب
سفارشی سازی ASP.NET Core Identity - قسمت اول - موجودیت‌های پایه و DbContext برنامه
یعنی امضای موجودیت‌های تعریف شده‌ی در برنامه‌ی شما مشکل دارند. امضای تک تک آن‌ها را با آخرین نمونه‌های ارسالی تطابق دهید (این امضاها از نگارش 1 به 2، کاملا تغییر کرده‌اند و آخرین تغییرات آن‌ها در مخزن کد، لحاظ شده‌اند).
نظرات مطالب
فعال سازی قسمت آپلود تصویر و فایل Kendo UI Editor
جهت اطلاع

تمام مثال‌های این سری به ASP.NET Core منتقل شدند. کدهای نهایی آن‌ها را از مخزن کد KendoUI.Core.Samples می‌توانید دریافت کنید.
این مثال‌ها بر اساس Kendo UI Professional R2 2017 SP1 تهیه شده‌اند (فایل‌های مورد نیاز هم پیوست شده‌اند).  
نظرات مطالب
ایجاد Drop Down List های آبشاری توسط Kendo UI
جهت اطلاع

تمام مثال‌های این سری به ASP.NET Core منتقل شدند. کدهای نهایی آن‌ها را از مخزن کد KendoUI.Core.Samples می‌توانید دریافت کنید.
این مثال‌ها بر اساس Kendo UI Professional R2 2017 SP1 تهیه شده‌اند (فایل‌های مورد نیاز هم پیوست شده‌اند).