کار با جعبه بندی در سی شارپ - object ref in csharp


دات وایت | DotWhite.ir
کار با جعبه بندی در سی شارپ - object ref in csharp

در این پست از دات وایت بطور کامل کار با جعبه بندی در سی شارپ را یاد خواهید گرفت برای درک بهتر مطلب آموزش همراه با مثال می باشد.

NET .يك نوع داده خاص Object دارد كه مقادير هر نوع دادهاي را ميپذيرد. در صورتيكه نوع يك مقدار مشخص نباشد، آن يك روش كلي براي ارسال پارامترها و انتساب مقادير فراهم ميكند. با هر چيز منتسب شده به Object بايستي به صورت يك نوع داده ارجاعي رفتار شود و روي Heap ذخيره ميگردد. دستورات زير را ملاحظه نماييد:

int age = ١٧;

 object refAge = age;

دستور اول متغير age را ايجاد ميكند و مقدار آن را روي Stack قرار ميدهد. دستور دومي مقدار age را به يك نوع دادهي ارجاعي منتسب ميكند. آن دستور مقدار 17 را روي Heap قرار ميدهد و اشارهگرهاي سربار را اضافه ميكند و در Stack يك ارجاع به آن اضافه ميكند، اين عمل را جعبهبندي گويند. تبديل يك نوع داده ارجاعي به يك نوع داده مقداري "از " گفته ميشود و با قالب بندي يك شي به نوع داده اصلي آن انجام ميشود. حال شي ايجاد شده در مثال 2 جعبه در آوردن قبلي را از جعبه در ميآوريم. 

int newAge = (int) refAge; 

string newAge = (string) refAge; // Fails. InvalidCastException


توجه داشته باشيد مقداري كه از جعبه درآورده ميشود، بايد از همان نوع داده قالببندي شده باشد. در كل، جعبه بندي ميتواند صرف نظر شود، چون ClR جزئيات را بطور شفاف كنترل ميكند. با اين وجود، زمان طراحي كد، ذخيره ي مقدار زيادي از دادههاي عددي در حافظه را بررسي كنيد. براي اين منظور كلاسهاي Array.System و ArrayList را ملاحظه كنيد. هر دو از انواع داده ارجاعي هستند، اما از نظر ذخيره مقادير دادهاي ساده كاملا متفاوت عمل ميكنند. متدهاي Arraylist براي كار روي نوعداده كلي Object طراحي شدهاند. در نتيجه،ArrayList همه عناصر را به صورت انواع داده ارجاعي ذخيره ميكند. اگر دادهي مورد نظر جهت ذخيره، يك نوع دادهي مقداري باشد، قبل از ذخيره بايد جعبهبندي شود. از طرف ديگر آرايه ميتواند هر دو نوع دادهي مقداري و ارجاعي را نگه دارد. آن با انواع داده ارجاعي همانند ArrayList رفتار ميكند، ولي انواع داده مقداري را جعبهبندي نميكند. كد زير يك آرايه و يك ArrayList از مقادير صحيح ايجاد ميكند. همانطور كه در شكل زیر نشان داده شده است، مقادير در حافظه كاملا با روش متفاوتي ذخيره ميشوند. 

// Create array with four values int[] ages = {١،٢،٣،٤};

 // Place four values in ArrayList ArrayList ages = new ArrayList();

 for (int i=٠; i<٤; i++) { ages.add(i);

 // expects object parameter

مقايسه ي Array و ArrayList در حافظه :

متغير آرايه، مقادير را به صورت مقادير int ذخيره ميكند. ArrayList هر مقداري را جعبهبندي ميكند. آن سپس سربار مورد نياز بوسيله انواع دادهي ارجاعي را اضافه ميكند. اگر برنامه كاربردي شما مقدار زيادي داده در حافظه ذخيره ميكند و ويژگيهاي خاص ArrayList را نياز ندارد، آرايه يك پيادهسازي كاراتري است. اگر از . 0NET,2 استفاده ميكنيد، كلاس List بهترين انتخاب است، چون جعبهبندي را حذف ميكند و ويژگيهاي انعطافپذير ArrayList را شامل است. 

نكته : زماني كه يك متغير از ميدان خارج ميگردد، حافظه ي آن از روي Stack آزاد ميشود. در صورتي كه حد مشخص حافظه سيستم استفاده گردد، GC حافظه ي آشغال روي Heap را آزاد ميكند. GC به وسيله ي .NET كنترل ميگردد و بطور اتوماتيك در فاصله هاي غيرقابل پيش بيني اجرا ميگردد. 



تاریخ انتشار : یکشنبه 05 دي 1395 ساعت: 13:24 | نظرات()
برچسب ها : , , , , ,

نویسنده :

بازديد : 475

موضوع: سی شارپ , کد های مفید ,

بخش نظرات این مطلب
نام
ایمیل (منتشر نمی‌شود) (لازم)
وبسایت
:) :( ;) :D ;)) :X :? :P :* =(( :O @};- :B /:) :S
نظر خصوصی
مشخصات شما ذخیره شود ؟ [حذف مشخصات] [شکلک ها]
کد امنیتیرفرش کد امنیتی