درود
عزیزان به جز اینکه آبجکت در زمان کامپایل نوع داده مشخص میشه و داینامیک در زمان ران تایم. چه تفاوت های دیگری دارند؟
درود
عزیزان به جز اینکه آبجکت در زمان کامپایل نوع داده مشخص میشه و داینامیک در زمان ران تایم. چه تفاوت های دیگری دارند؟
اولی زمان ران تایم و دومی کامپایل.کد:برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
خیلی شبیه به هم هستند
سلام
سوال جالبی میتواند باشد!
در جهت تکمیل توضیح کوتاه دوستمان iranch میتوانم اضافه کنم...
شباهت فوق العاده:
هردو نوع از نظر پایه ذخیره سازی یکسان هستند در واقع در CLR متغییری به نام dynamic وجود ندارد، (شاهد آنکه دستور typeof یا توابع توسعه یافته روی این نوع و تنها این نوع کار نمیکند!) dynamic در واقع و دقیقاً همان object است.
وقتی متغییری از جنس dynamic تعریف میکنید در واقع متغییری از جنس object تعریف کرده اید.
تفاوت در نحوه رفتار کامپایلر #C با عملیات های روی dynamic است.
برای تصور بهتر از رفتار کمکی کامپایلر ارجاعتان میدهم به عبارات Lambda (که همانطور که میدانید فقط نوعی خلاصه نویسی برای توابع عادی هستند و کامپایلر بجای ما تابع را بصورت عادی در فضای کلاس تولید میکند و کار تایپ ما را کاهش میدهد)
همین وضعیت کاهش کد نویس و تولید کد خودکار توسط کامپایلر برای متغییر های dynamic هم رخ میدهد.
بااجازتان الآن دیروقت است... تفاوت این دو را در فردا یا تعطیلی پس فردا تایپ میکنم و با مثال هایی توضیح میدهم.
شب خوش.
من یکی پیدا کردم.
اولین تفاوت و چرا؟
مورد دوم 10 رو می چسبونه به "10" اما مورد اول خیر.
و جالب اینجاست که تابع GetType اگر روی هر دو اعمال کنیم . میگه String هست.
کد:برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
Last edited by Life24; 04-06-2014 at 18:50.
سلام مجدد
میبخشید زودتر نتوانستم، متاسفانه این چند روز کمی گرفتار هستم...
هر عملیاتی که روی نوع dynamic انجام شود توسط کامپایلر با نوعی از دستورات reflection انجام میشود، در واقع شما میتوانید هر متد و خصیصه و عملیاتی را روی dynamic نوشته و با موفقیت کامپایل کنید، اگر چیز غیر ممکنی نوشته باشید در زمان اجرا خطا دریافت خواهید کرد.
مورد اول:
فراموش نکنید در CLR نوع dynamic معنی ندارد و وجود ندارد.
متغییر dynamic همان متغییر object است یعنی واقعاً object است فقط وجود این کلمه جدید تفاوت رفتار کامپایلر را سبب میشود پس موارد زیر غیر مجاز هستند:
مورد دوم:کد:برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
دقت کنید که هر خصیصه ای روی dynamic صحیح کامپایل میشود ولی یافتن آن خصیصه در زمان اجرا و بر اساس پایه متنی کشف و اجرا میشود، این عملیات بسیار کندتر ولی انعطاف پذیری بالایی دارد.
مورد سوم:کد:برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
عملیات روی dynamic شامل بازتعریف اپراتورها نیز میباشد.
مورد چهارم:کد:برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
حتماً میدانید که کامپایلر #C تبدیلات پرانتزی را به سه گروه متفاوت از دستورات کامپایل میکند Convert/Cast/Box
میبینید که تبدیل پرانتزی روی object کامپایل به یک عملیات unboxing میشود (یا cast) ولی dynamic بدون هیچ نیازی به تبدیل پرانتزی همان عمل را انجام میدهد و تبدیل واضح پرانتزی منجر به کامپایل عملیات convert میشود.
مورد پنجم:کد:برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
بدیهی است به علت ماهیت reflection در نوع dynamic این کدها در موارد وراثتی و پلی مورفیزمی رفتار چندان صحیحی ندارند (حداقل از یک زاویه دید) پس باید در این متغییر ها حواستان به روابط پلی مورفیزمی باشد و نتایج کاملاً متفاوت و بعضاً نامعقول باشد، مانند:
(البته برای این مورد و عواقب آن میشد مثال بسیار جالب تری هم زد ولی فعلاً گمانم همین ساده تر است و برای کسی که بفهمد هشداری کافی است و برای کسی هم که عواقب آن را متوجه نشود که ما نمیتوانیم کل OOP را اینجا یاددهیمکد:برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید)
مورد ششم:
با کمک کلاس هایی مانند ExpandoObject میتوان امکانات مشابه زبان های javascript و ruby و python و... را پیاده سازی کرد.
(حتماً دیده اید، این همان قابلیتی است که MVC در ViewBag از آن استفاده میکند)کد:برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
مورد هفتم:
توانایی dynamic در شناسایی خصایص و توابع و... به انواع دات نتی محدود نمیشود و میتوان از ان برای کار با اشیای COM هم استفاده نمود.
و...
و...
و...
برای درک تفاوت کافیست ماهیت reflection در عملیات های dynamic را درک کنید.
=====
فراموش نکنید اگر نیاز داشتید مشکلی ندارد ولی همه اینها پردازش اضافه نیاز دارند و این یعنی افت سرعت و بازدهی نسبت به کدنویسی عادی.
شب خوش.
Last edited by _H2_; 07-06-2014 at 00:22.
هم اکنون 1 کاربر در حال مشاهده این تاپیک میباشد. (0 کاربر عضو شده و 1 مهمان)