تبلیغات :
ماهان سرور
آکوستیک ، فوم شانه تخم مرغی ، پنل صداگیر ، یونولیت
دستگاه جوجه کشی حرفه ای
فروش آنلاین لباس کودک
خرید فالوور ایرانی
خرید فالوور اینستاگرام
خرید ممبر تلگرام

[ + افزودن آگهی متنی جدید ]




نمايش نتايج 1 به 5 از 5

نام تاپيک: تفاوت در نوع داده داینامیک با آبجکت

  1. #1
    آخر فروم باز
    تاريخ عضويت
    Nov 2009
    پست ها
    1,257

    پيش فرض تفاوت در نوع داده داینامیک با آبجکت

    درود
    عزیزان به جز اینکه آبجکت در زمان کامپایل نوع داده مشخص میشه و داینامیک در زمان ران تایم. چه تفاوت های دیگری دارند؟

  2. این کاربر از iranch بخاطر این مطلب مفید تشکر کرده است


  3. #2
    آخر فروم باز
    تاريخ عضويت
    Nov 2009
    پست ها
    1,257

    پيش فرض

    کد:
    برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
    اولی زمان ران تایم و دومی کامپایل.
    خیلی شبیه به هم هستند

  4. این کاربر از iranch بخاطر این مطلب مفید تشکر کرده است


  5. #3
    ناظر انجمن .NET Framework _H2_'s Avatar
    تاريخ عضويت
    Feb 2007
    محل سكونت
    یک جایی بین Framework و نارمک!
    پست ها
    4,746

    پيش فرض

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

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

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

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

  6. 2 کاربر از _H2_ بخاطر این مطلب مفید تشکر کرده اند


  7. #4
    آخر فروم باز
    تاريخ عضويت
    Jul 2009
    پست ها
    6,351

    پيش فرض

    من یکی پیدا کردم.
    اولین تفاوت و چرا؟
    مورد دوم 10 رو می چسبونه به "10" اما مورد اول خیر.
    و جالب اینجاست که تابع GetType اگر روی هر دو اعمال کنیم . میگه String هست.
    کد:
    برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
    Last edited by Life24; 04-06-2014 at 18:50.

  8. #5
    ناظر انجمن .NET Framework _H2_'s Avatar
    تاريخ عضويت
    Feb 2007
    محل سكونت
    یک جایی بین Framework و نارمک!
    پست ها
    4,746

    پيش فرض

    سلام مجدد
    میبخشید زودتر نتوانستم، متاسفانه این چند روز کمی گرفتار هستم...
    هر عملیاتی که روی نوع 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.

  9. 2 کاربر از _H2_ بخاطر این مطلب مفید تشکر کرده اند


Thread Information

Users Browsing this Thread

هم اکنون 1 کاربر در حال مشاهده این تاپیک میباشد. (0 کاربر عضو شده و 1 مهمان)

User Tag List

قوانين ايجاد تاپيک در انجمن

  • شما نمی توانید تاپیک ایحاد کنید
  • شما نمی توانید پاسخی ارسال کنید
  • شما نمی توانید فایل پیوست کنید
  • شما نمی توانید پاسخ خود را ویرایش کنید
  •