مشاهده نسخه کامل
: چرا .Net به نوع داده آبجکت نیاز پیدا کرد؟
سلام
چرا به نوع داده Object احتیاج پیدا کرد؟ و آن را ایجاد کرد؟
سوال انحرافی به نظر می رسد اما :
چند دلیل با روشی خاص:
1- چون C به اشاره گر void احتیاج پیدا کرد!
2- چون معادل لفظ "چیز" در زبان انسانی باشد!
3- چون معادل حضرت آدم در جامعه ی انسانی باشد!
4- و دلایل دیگر :n02:
----------------
حال با روشی بهتر:
معادله را برعکس نبینید. اول object بوده بعد عناصر دیگر. نه اینکه بگوییم چرا احتیاج پیدا کرد (مفهوم ادبیاتی جمله: و در قبل نبود)
در واقع object ها قالب اولیه عناصر هستند. این قالب ها را می توان تنها یک آدرس حافظه در نظر گرفت و بس! حالا اگر ما فقط یک آدرس حافظه داشته باشیم می توانیم به آدرسی که این نوع اشاره می کند هرگونه که نیاز داریم نگاه کنیم. مثلا بگوییم آن یک محتوای زمانی دارد. یا اینکه یک فرم است.
پس می بایست در ابتدا یک مشخصه برای حافظه بوجود آید سپس قالب های جدید در نظر گرفته شوند. این عمل نیز باعث سهولت در تبدیل عناصر به هم نیز هست.
از دید شی گرایی نیز می توان اینگونه استنباط کرد که والد شی مشخص می شود. این والد ساده ترین والد است. فقط یک مشخصه برای ولد خود دارد آن هم وجودیت در حافظه هست و این وجودیت به معنای همه چیز برای شی هست.
مثلا اگر یک نمونه از کلاس DateTime بگیریم آنگاه این نمونه یک اشاره گر با خاصیت زمانی به حافظه هست. حالا اگر Object نباشد جمله ی قبل این گونه می شود:
این نمونه یک خاصیت زمانی به حافظه هست! ،
جمله به سختی معنا دارد اما واضح است که یک مشخصه کم دارد. چون حافظه که انحصاری از بایت است چگونه خاصیت زمانی ارائه می کند؟ بهتر است بگوییم که تعدادی از خانه ها که در فلان جا قرار دارند (اشاره گر) دارای ساختار زمانی (DateTime) هستند. با این جمله بندی اصل وراثت نیز آسیب نمی بیند.
این اشاره گر در جمله ی بالا همان نوع object هست!
در یک دید بعید از شی گرایی:
ما در دنیای واقعی یک شی را که نمی دانیم چیست و هنوز به ما معرفی نشده است را چی صدا می زنیم: "چیز" !
حالا در جایی از برنامه که نوع داده مشخص نیست و برنامه نویس به سلیقه خود ورودی و خروجی می دهد وضعیت کامپایلر چگونه است؟ می گوید این "چیز!"
و دوباره دلایل دیگر:n04:.
موفق باشید.
درووووووود منم سوال دارم فرق این دوتا باهم چیه??????????????؟ راستش من هم نمیفهمم!!!!!!!!!!!! :n04:
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
یعنی هر کاری که با اولی میشه کرد با آبجکت هم میشه کرد؟
فرق دارند و خیلی ساده هست، مسئله را پیچیده نبینید.
همان طور که می دانید در خط اول آرایه ی تعریفی شما یک آرایه int هست پس شما در هر جا که از آن استفاده کنید یک عبارت صریح (explicit) دارید یعنی می توانید مستقیم از آن استفاده کنید و کامپایلر می داند که نوع عنصر شما چگونه است. اما در خط دوم شما یک آرایه ی int دارید اما این رو ما می دونیم!
اصطلاح Boxing و Unboxing :
عناصر object را نمی شناسیم یعنی اگر یک برنامه به ما دادند نمی دانیم که ماهیت این عنصر چیست و چگونه باید از آن استفاده کنیم. مثل این می ماند که یک هدیه به ما بدهند و آن را در چهبه بگذارند و ما تا آن را باز نکنیم نمی دانیم آن چیست. این باز کردن مثال گرفتن GetType از یک شی Object می باشد. حال که نوع آن را شناختیم می توانیم از آن استفاده کنیم. در واقع با تبدیل نوع object به نوع مورد نظر عمل unboxing را انجام داده ایم.
به این شکل دقت کنید: (منبع ([ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]))
[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]
همان طور که مشخص است یک متغیر int را درون یک متغیر object می ریزد. متغیر i قبلا درون استک بوده است اما زمانی که درون یک object ریخته می شود مقدار به حافظه ی Heap منتقل می شود. نکته ای هم که در این بخش وجود دارد این است که علاوه بر انتقال مقدار نوع نیز در حافظه ذخیره می گردد. این عمل برای آن است که متد GetType بتواند پاسخ مناسب را برگرداند و با این عمل تبدیلات امکان پذیر می شود. این می شود Boxing .
به شکل زیر دقت کنید: (منبع همان قبلی)
[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]
شکل ادامه ی شکل قبل هست و در این شکل یک متغیر j تعریف شده است که با یک cast مستقیم از آبجکت o مقدایر را برداشته است، با ین عمل مقدار را به استک کپی کرده است. حالا مانند همان قبل قابل دسترس هست. این عمل هم می شود Unboxing .
دو نکته در این بخش حائز اهمیت است:
1- عمل تبدیل در Box و Unbox بسیار کند است. پس نباید پیوسته استفاده شود و در حلقه قرار گیرد.
2- هنگام Unbox می بایست cast صحیح انجام داد یعنی بدانیم درون جعبه چه چیز ممکن است وجود داشته باشد. ( یک هدیه می گیرید و به امید اینکه قابلمه هست می روید در آشپزخانه، آن هنگام است که می بینید هدیه دستمال توالت است و در آنجاست که مطمئنا Throw Exception خواهید داد:n02:)
------
ادامه ی سوال شما: بلی هرکاری می شود کرد. اما شما Performance را از دست می دهید.
موفق باشید.
vBulletin , Copyright ©2000-2025, Jelsoft Enterprises Ltd.