PDA

نسخه کامل مشاهده نسخه کامل : تفاوت در نوع داده داینامیک با آبجکت



iranch
02-06-2014, 23:11
درود
عزیزان به جز اینکه آبجکت در زمان کامپایل نوع داده مشخص میشه و داینامیک در زمان ران تایم. چه تفاوت های دیگری دارند؟

iranch
02-06-2014, 23:27
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
اولی زمان ران تایم و دومی کامپایل.
خیلی شبیه به هم هستند

_H2_
03-06-2014, 01:43
سلام
سوال جالبی میتواند باشد!
در جهت تکمیل توضیح کوتاه دوستمان iranch میتوانم اضافه کنم...
شباهت فوق العاده:
هردو نوع از نظر پایه ذخیره سازی یکسان هستند در واقع در CLR متغییری به نام dynamic وجود ندارد، (شاهد آنکه دستور typeof یا توابع توسعه یافته روی این نوع و تنها این نوع کار نمیکند!) dynamic در واقع و دقیقاً همان object است.
وقتی متغییری از جنس dynamic تعریف میکنید در واقع متغییری از جنس object تعریف کرده اید.

تفاوت در نحوه رفتار کامپایلر #C با عملیات های روی dynamic است.
برای تصور بهتر از رفتار کمکی کامپایلر ارجاعتان میدهم به عبارات Lambda (که همانطور که میدانید فقط نوعی خلاصه نویسی برای توابع عادی هستند و کامپایلر بجای ما تابع را بصورت عادی در فضای کلاس تولید میکند و کار تایپ ما را کاهش میدهد)

همین وضعیت کاهش کد نویس و تولید کد خودکار توسط کامپایلر برای متغییر های dynamic هم رخ میدهد.

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

Life24
04-06-2014, 18:48
من یکی پیدا کردم.
اولین تفاوت و چرا؟
مورد دوم 10 رو می چسبونه به "10" اما مورد اول خیر.
و جالب اینجاست که تابع GetType اگر روی هر دو اعمال کنیم . میگه String هست.

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

_H2_
06-06-2014, 23:12
سلام مجدد
میبخشید زودتر نتوانستم، متاسفانه این چند روز کمی گرفتار هستم...
هر عملیاتی که روی نوع dynamic انجام شود توسط کامپایلر با نوعی از دستورات reflection انجام میشود، در واقع شما میتوانید هر متد و خصیصه و عملیاتی را روی dynamic نوشته و با موفقیت کامپایل کنید، اگر چیز غیر ممکنی نوشته باشید در زمان اجرا خطا دریافت خواهید کرد.

مورد اول:
فراموش نکنید در CLR نوع dynamic معنی ندارد و وجود ندارد.
متغییر dynamic همان متغییر object است یعنی واقعاً object است فقط وجود این کلمه جدید تفاوت رفتار کامپایلر را سبب میشود پس موارد زیر غیر مجاز هستند:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

مورد دوم:
دقت کنید که هر خصیصه ای روی dynamic صحیح کامپایل میشود ولی یافتن آن خصیصه در زمان اجرا و بر اساس پایه متنی کشف و اجرا میشود، این عملیات بسیار کندتر ولی انعطاف پذیری بالایی دارد.


برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

مورد سوم:
عملیات روی dynamic شامل بازتعریف اپراتورها نیز میباشد.


برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

مورد چهارم:
حتماً میدانید که کامپایلر #C تبدیلات پرانتزی را به سه گروه متفاوت از دستورات کامپایل میکند Convert/Cast/Box
میبینید که تبدیل پرانتزی روی object کامپایل به یک عملیات unboxing میشود (یا cast) ولی dynamic بدون هیچ نیازی به تبدیل پرانتزی همان عمل را انجام میدهد و تبدیل واضح پرانتزی منجر به کامپایل عملیات convert میشود.


برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

مورد پنجم:
بدیهی است به علت ماهیت reflection در نوع dynamic این کدها در موارد وراثتی و پلی مورفیزمی رفتار چندان صحیحی ندارند (حداقل از یک زاویه دید) پس باید در این متغییر ها حواستان به روابط پلی مورفیزمی باشد و نتایج کاملاً متفاوت و بعضاً نامعقول باشد، مانند:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
(البته برای این مورد و عواقب آن میشد مثال بسیار جالب تری هم زد ولی فعلاً گمانم همین ساده تر است و برای کسی که بفهمد هشداری کافی است و برای کسی هم که عواقب آن را متوجه نشود که ما نمیتوانیم کل OOP را اینجا یاددهیم:n02:)

مورد ششم:
با کمک کلاس هایی مانند ExpandoObject میتوان امکانات مشابه زبان های javascript و ruby و python و... را پیاده سازی کرد.


برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
(حتماً دیده اید، این همان قابلیتی است که MVC در ViewBag از آن استفاده میکند)

مورد هفتم:
توانایی dynamic در شناسایی خصایص و توابع و... به انواع دات نتی محدود نمیشود و میتوان از ان برای کار با اشیای COM هم استفاده نمود.

و...
و...
و...
برای درک تفاوت کافیست ماهیت reflection در عملیات های dynamic را درک کنید.

=====

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