زمانی که در برنامه میخواهیم خطایی را صادر کنید، معمولا از 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
خیلی ممنون بابت توضیحات خوب و کاربردیتون
ارسال شده در تاریخ یکشنبه، ۰۴ اردیبهشت ۱۴۰۱خواهش می کنم جناب صداقت 😁
ارسال شده در تاریخ یکشنبه، ۰۴ اردیبهشت ۱۴۰۱