Handle
handle (هندل) نوعی اشاره گر هوشمند (یا اشاره گر نوعی هندل!) به حساب می آید. هندل دارای تشابهاتی با اشاره گر های معمولی C++ است ولی تفاوت های مهمی نیز با آنها دارد. هندل یک آدرس را در خود ذخیره می کند که به طور مداوم به وسیله Garbage Collector (زباله روب) در صورت تغییر مکان شی ارجاع شده، آپدیت می شود. البته نمیتوان بر روی هندل مانند اشاره گر های معمولی، عملیات حسابی انجام داد.
هندل ها برای ارجاع به اشیایی که بر روی CLR heap ایجاد می شوند، استفاده می شوند. تمام اشیایی که از نوع کلاس ارجاع هستند، بر روی heap ذخیره می شوند؛ بنابر این متغیر هایی که شما برای ارجاع به آن اشیاء ایجاد می کنید باید یک هندل باشند. برای مثال کلاس String یک نوع کلاس ارجاع است، پس متغیر های که اشیاء String اشاره ارجاع دارند، باید یک هندل باشند. حافظه برای انواع کلاس مقداری به طور پیشفرض بر روی stack یا "پشته" (محلی برای ذخیره و بازیابی داده ها) اختصاص می یابد. ولی می توان با استفاده از عملگر gcnew متغیر ها را بر روی heap ذخیره کرد. متغیر هایی که در CLR heap ذخیره شده اند (که شامل تمام انواع ارجاع CLR نیز می شوند) نمی توانند به صورت عمومی اعلان شوند.
برای ایجاد یک هندل برای یک نوع مشخص باید پس از آوردن نوع، از علامت ^ استفاده کرد. برای مثال برای اعلان یک هندل به نام "Name" که بتواند آدرس یک شی String را ذخیره کند به صورت زیر عمل می کنیم :
String^ Name;
این کد یک هندل به نام Name از نوع String^ ایجاد می کند. هنگامی که یک هندل را اعلان می کنید، به صورت خودکار با null مقدار دهی می شود؛ (یعنی به هیچ چیز اشاره نمی کند.) برای اینکه به صورت دستی یک هندل را برابر null قرار دهید، باید از کلمه کلیدی nullptr استفاده کنید. مانند زیر :
Name = nullptr;
اگر یک هندل را با مقدار 0 مقدار دهی کنید، مقدار 0 به نوعی که هندل به آن اشاره دارد، تبدیل می شود و مقدار این شی جدید در هندل ذخیره می شود.
(کلمه ی کلیدی nullptr در C++/CLI با Native C++ تفاوت دارد؛ البته اگر در برنامه خود کد های Native را با کد های CLI به صورت مخلوط استفاده نمی کنید، این تفاوت اهمیتی ندارد. ولی اگر از هر دو نوع کد استفاده می کنید باید از کلمه ی _nullptr برای کد های Native و از nullptr برای کد های CLI استفاده کنید.)
هندل ها را می توان مانند متغیر ها در هنگام اعلان، مقدار دهی کرد. در مثال بالا ، کد زیر هنگام اعلان هندل آن را مقدار دهی می کند:
String^ Name (L"this is a System_string");
این خط یک شی String بر روی heap ایجاد می کند و مقدار داخل پرانتز را به آن نسبت می دهد. نوع رشته ی کاراکتری بالا در حقیقت یک const wchar_t* است، تعریف شدن string ها به این صورت این امکان را می دهد که به این شکل مقدار دهی شوند.
خط زیر یک هندل برای نوع int اعلان و مقدار دهی می کند:
int^ Name (100);
Name یک هندل به نوع int است که دارای مقدار 100 است. این هندل نمیتواند در عملیات حسابی شرکت کند، مگر حالتی که مقدار یابی (یا ارجاع یابی) شود. برای این کار مانند اشاره گر های معمولی از عملگر * استفاده می شود. البته هنگامی که در کد ها، هندل در طرف چپ تساوی قرار گیرد نیازی به این کار نیست و کامپایلر این کار را انجام می دهد. (البته می توانید به صورت دستی نیز این کار را انجام دهید.).( هندل های string مانند اشاره گر های string کمی متفاوت از انواع دیگر هستند.)
// these Two Lines are the same
Name = 150;
*Name = 150;
Ivar Horton's "Beginning Visual C++ 2010"
+ نوشته شده در پنجشنبه ششم بهمن ۱۳۹۰ ساعت 19:31 توسط MEC
|
GENERAL INFORMATION