بررسی هزینههای پنهان بررسی مقدار تهی (Null Check) در کدهای جنریک سیشارپ
نویسنده: وحید نصیری
تاریخ: ۱۴۰۴/۰۲/۱۴ ۰۸:۳۹
آدرس: www.dntips.ir
| مطالب | ۳۶۹۴ |
| نویسندگان | ۲۷۶ |
| گروههای مطالب | ۱۰۲۴ |
| نقشههای راه | ۱۱۹ |
| دورهها | ۱۴ |
| اشتراکها | ۱۷۹۱۴ |
public bool IsNull<T>(T value)
{
return value == null;
}string، object یا کلاسهای سفارشی. با این حال، مشکل زمانی ظاهر میشود که نوع T یک نوع مقداری (Value Type) مانند int، bool یا struct باشد.== null بر روی یک نوع مقداری در یک متد جنریک استفاده میکنید، کامپایلر مجبور به جعبهگذاری (Boxing) آن میشود. این بدان معناست که:IsNull<int>(0);
false (زیرا 0 تهی نیست) برگردانده میشود، سیستم همچنان مجبور است حافظه را روی هیپ (Heap) تخصیص داده و بعداً آن را پاک کند که این امر باعث اتلاف عملکرد میشود.public bool IsNull<T>(T value)
{
return EqualityComparer<T>.Default.Equals(value, default(T));
}EqualityComparer<T>.Default: این ویژگی بهترین روش مقایسه مقادیر را برای نوع T فراهم میکند.default(T) مقدار پیشفرض نوع T را برمیگرداند:null برای انواع مرجع (Reference Types).false یا یک ساختار (Struct) خالی برای انواع مقداری (Value Types).IsNull<string>(null); // true IsNull<int>(0); // true IsNull<bool>(false); // true IsNull<int>(5); // false
is null استفاده کرد:public bool IsNull<T>(T value) where T : class?
{
return value is null;
}false برمیگرداند.public bool IsNull<T>(T value)
{
return value is null || EqualityComparer<T>.Default.Equals(value, default(T));
}| رویکرد | انواع مرجع (Reference Types) | انواع مقداری غیر تهیپذیر (Non-Nullable Value Types) | انواع مقدار تهیپذیر (Nullable Value Types) | مصرف حافظه (انواع مقدار) |
value == null | سریع | جعبهگذاری رخ میدهد | جعبهگذاری رخ میدهد | بالاتر، به دلیل جعبهگذاری |
EqualityComparer<T>.Default.Equals(value, default(T)) | خوب | مقایسه کارآمد مقدار | بررسی کارآمد مقدار تهی | پایینتر، جلوگیری از جعبهگذاری |
value is null (C# 7+) | سریع | همیشه false | بررسی کارآمد مقدار تهی | پایینتر، جلوگیری از جعبهگذاری |
value == null میتواند به طور پنهان به عملکرد آسیب برساند، به ویژه در مورد انواع مقدار (Value Types) به دلیل جعبهگذاری (Boxing). به جای آن، از روشهای زیر استفاده کنید:EqualityComparer<T>.Default.Equals(value, default(T)) برای بررسیهای ایمن و کارآمد در تمام انواع.is null برای بررسیهای تمیز مقدار تهی (null) در انواع مرجع (Reference Types) و انواع مقدار تهیپذیر (Nullable Value Types) (C# 7+).