PDA

View Full Version : مبتدی: علت استفاده از using چیست ؟



Mohammadvb6
یک شنبه 01 مرداد 1391, 20:44 عصر
علت استفاده از using در تعریف یک شی از نوع entity framework چیه ؟

مثلا :


using (PersonEntities db = new PersonEntities())

imanasp
دوشنبه 02 مرداد 1391, 00:12 صبح
using in C# can be used in two ways:
as a shortcut to typing long namespaces used in code
as a means of properly and automatically close and dispose any object references implementing the IDisposable interface

مهرداد صفا
دوشنبه 02 مرداد 1391, 01:19 صبح
علت استفاده از using در تعریف یک شی از نوع entity framework چیه ؟

مثلا :


using (PersonEntities db = new PersonEntities())



سلام
با استفاده از عبارت using ابتدا یک object ساخته میشود و اطمینان داریم که در پایان object Dispose خواهد شد و تمام منابع آن از حافظه آزاد خواهد شد. البته object ساخته شده باید وارث System.IDisposable باشد تا قابلیت Dispose شدن را داشته باشد. اما این موضوع وقتی اهمیت پیدا میکند که ما مثلا با sql یا یک wrapper کار میکنیم و ضروری است که بعد از اتمام کار مثلا Conection خود را از بین برده یا mediaplayer را Dispose کنیم تا فایلهای مورد استفاده آن Unlock شوند و فضای memory آزاد گردد.
بهتر است این مسائل در انجمنهای تخصصی زبانهای vb یا c# مطرح شود.

forodo
پنج شنبه 27 تیر 1392, 01:01 صبح
سلام
لطفاً کمی واضح تر توضیح دهید.
یعنی چی که از حافظه پاک می شود؟
لطفاً دقیق تر بگید کجا ازش استفاده می شود؟
Dispose چیه؟
با تشکر

مهرداد صفا
پنج شنبه 27 تیر 1392, 09:49 صبح
با سلام.
همانطورکه می دانید با ساخته شدن هر شی مقداری از فضای حافضه به آن اختصاص داده می شود. مثلا یک int32 به چهار بایت یا 32 بیت فضا برای نگهداری اعداد نیاز دارد که این فضا معمولا توسط رم (ram) سیستم تامین می شود (گاهی هم از حافظه cpu و hard برای این موضوع استفاده می شود).
شاید بگویید که" 4 بایت در برابر مقدار حافظه سیستم مقدار زیادی نیست". بله ولی مشکل زمانی ایجاد می شود که شما در برنامه از هزاران و شاید میلیونها 4 بایت استفاده می کنید. اگر به ساختار کلاسهایی که از آنها در برنامه استفاده می کنید نگاه کنید دهها و صدها اشیا وابسته به یکدیگر را برای هر کلاس می بینید که همانطور که گفته شد نمونه گیری از این کلاسها نیازمند فضای کافی از حافظه است.
این اختصاص حافظه (memory allocation) و آزاد سازی منابع (به طور کلی memory management) در .net به صورت خودکار صورت می گیرد. یعنی با ساخت هر شی به طور خودکار فضای مورد نیاز به آن اختصاص داده می شود و معمولا بعد از out of scope شدن شی (مثلا پایان متودی که متغیر محلی در آن تعریف شده) و یا زمانی که برنامه با کمبود فضا مواجه شود اشیایی که اشاره گری به آنها موجود نیست از حافضه پاک می شود.
اما گاهی این قضیه مطابق میل شما پیش نمی رود. مثلا فرض کنید که یک connection از طرف برنامه شما به sqlServer متصل شده و بر اثر حجم بالای داده ها و محاسبات فضای خیلی زیادی از حافضه اشغال شده است. در این مواقع ممکن است حجم بالای حافظه اشغالی در کارایی برنامه ها تاثیر منفی داشته باشد و از طرفی با out of scope شدن connection هم چون ارتباط sqlServer هنوز با connection بر قرار است منابع به طور خودکار آزاد نشوند و این موضوع مشکل ساز شود. موارد مشابه زیادی در کار با منابع UnManaged و به طور کلی هر شی که به هر شکل با محیط خارج از .net مرتبط است وجود دارد.
در این مواقع برنامه نویس باید به طور دستی اشیا ساخته شده را تخریب کند، ارتباطات را خاتمه دهد و فضا را آزاد کند. این اعمال معمولا در متود dispose و destructor ها نوشته می شوند.
استفاده از فرمان using تضمین میکند که با به پایان رسیدن بلاک متود dispose شی ساخته شده فراخوانی می شود و شی ساخته شده از حافظه پاک می گردد. در واقع شما با using محدوده object ساخته شده را به بلاک using محدود می کنید و با پایان بلاک آن را dispose میکنید.

forodo
پنج شنبه 27 تیر 1392, 13:33 عصر
یعنی می توان هر منغیری یا شی از کلاسی که فقط در برنامه ی در حال اجرا یک بار از آن استفاده می شود از using استفاده کرد؟
اگر بخواهیم از متود dispose در کد بالا استفاده کنیم یا هر جای دیگر بعد از ساخت شی از کلاس یا تعریف متغیر که کار با آنها تمام شده متد را فراخوانی کنیم؟

مهرداد صفا
پنج شنبه 27 تیر 1392, 22:23 عصر
بلاک using در مورد اشیای محلی کاربرد دارد و شما میتوانید بسته به نیازتان از آن استفاده کنید. scope متغیرهای محلی محدود به تابعی است که متغیر در آن تعریف می شود که همانطور که گفته شد با استفاده از using شما این دامنه را به using محدود میکنید، با این تفاوت که دستور using تضمین می کند شما به هر نحوی که از بلاک using خارج شوید (چه با دستوراتی مثل return و چه بر اثر یک خطا یا exception و چه ...) شی تعریف شده dispose می شود و فضا آزاد می گردد و همین موضوع ارجعیت استفاده از using به جای اجرای متود Dispose به صورت دستی را نشان می دهد.
پس شما می توانید در تعریف اشیای محلی از using استفاده کنید.
شما می توانید بعد از تعریف شی متود Dispose را اجرا کنید ولی اگر ممکن است قبل از اجرای این متود به دلیل خاصی (مثل استفاده از return و یا unhandled exceptions) از تابعی که در آن هستید خارج شوید بهتر است که از using استفاده کنید تا این کار به صورت خودکار صورت گیرد.