زمانی که در برنامه می‌خواهیم خطایی را صادر کنید، معمولا از throw new exception استفاده می‌کنیم و متن مناسب خطا را درون کلاس exception قرار می‌دهیم. اما اگر تعداد این صادر کردن خطاها زیاد شود باعث افزایش کد assembly می‌شود. زمانی که در یک متد از throw استفاده می‌شود، چندین خط برای صادر کردن خطا ایجاد می‌شود و اگر در متدها از این کد استفاده کنیم، تعداد خط جنریت شده assembly بیشتر می‌شود. برای مثال کد زیر را در نظر بگیرید:

public static int ThrowExceptionDirectly()
{
    if (_number <= 0)
    {
        throw new Exception("Number should be greater than zero");
    }

    return ++_number;
}

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

            {
 nop  
                throw new Exception("Number should be greather than zero");
 mov         rcx,7FFF0C329410h  
 call        00007FFF6BE0AF00  
 mov         qword ptr [rbp+28h],rax  
 mov         ecx,1  
 mov         rdx,7FFF0C342820h  
 call        00007FFF6BDA49D0  
 mov         qword ptr [rbp+20h],rax  
 mov         rdx,qword ptr [rbp+20h]  
 mov         rcx,qword ptr [rbp+28h]  
 call        00007FFF0C295EA0  
 mov         rcx,qword ptr [rbp+28h]  
 call        00007FFF6BDAC9F0  
            }

اما اگر از یک Helper برای صادر کردن خطاها استفاده کنیم، کد اسمبلی جنریت شده کمتر خواهد شد. برای مثال:

public static int ThrowExceptionWithThrowHelper()
{
    if (_number <= 0)
    {
        ThrowHelper.ThrowException("Number should be greater than zero");
    }
    return ++_number;
}

کد اسمبلی مربوط به قطعه کد بالا به صورت زیر می‌باشد:

            {
 nop  
                ThrowHelper.ThrowException("Number should be greather than zero");
 mov         rcx,1B81A1C3080h  
 mov         rcx,qword ptr [rcx]  
 call        00007FFF0C2A5AB0  
 nop  
            }

همانطور که مشاهده می‌کنید کد اسمبلی ایجاد شده در متد دوم که از یک Helper برای صادر کردن خطا استفاده کردیم کمتر شده است. در این حالت ما کدهای لازم برای صادر کردن خطا را در یک متد دیگر قرار داده‌ایم که میتوانیم در جاهای مختلف از کد از آن استفاده کنیم و به جای آنکه درون متدها از  throw new exception استفاده کنیم و کد اسمبلی بیشتری جنریت شود، از ThrowHelper استفاده کنیم و کد کمتری جنریت شود.

کلاس ThrowHelper:

public static class ThrowHelper
{
    public static void ThrowException(string message)
    {
        throw new Exception(message);
    }
}

منبابع استفاده شده:

برای مشاهده کد Assembly جنریت شده می‌توانید زمانی که در حال دیباگ هستید و به خط مورد نظر رسیده‌اید، در ویژوال استودیو کلیدهای Ctrl+Alt+D را فشار دهید و کد جنریت شده را مشاهده کنید.

;)

Powered by Froala Editor

نظرات

سایر نظرات
  • مجتبی خادم صداقت

    خیلی ممنون بابت توضیحات خوب و کاربردیتون

    ارسال شده در تاریخ یکشنبه، ۰۴ اردیبهشت ۱۴۰۱
    • admin

      خواهش می کنم جناب صداقت 😁

      ارسال شده در تاریخ یکشنبه، ۰۴ اردیبهشت ۱۴۰۱