نمایش نتایج 1 تا 4 از 4

نام تاپیک: چگونه از IDisposable استفاد کنیم

  1. #1

    Cool چگونه از IDisposable استفاد کنیم

    با سلام و خسته نباشید

    دوستان عزیز اگه امکانش هست منو راهنمایی کنید:

    1- آیا همه کلاس هایی که تعریف می کنیم نیاز به مشتق گرفتن از IDisposable دارند؟

    2- چه زمانی یک کلاس نیاز به مشتق گرفتن از IDisposable دارد؟

    3- چگونه متد Dispose رو پیاده سازی کنیم؟

    متشکرم


  2. #2
    کاربر دائمی آواتار khokhan
    تاریخ عضویت
    دی 1388
    محل زندگی
    اسکو
    پست
    2,176

    نقل قول: چگونه از IDisposable استفاد کنیم

    نقل قول نوشته شده توسط Wily_Fox مشاهده تاپیک
    با سلام و خسته نباشید

    دوستان عزیز اگه امکانش هست منو راهنمایی کنید:

    1- آیا همه کلاس هایی که تعریف می کنیم نیاز به مشتق گرفتن از IDisposable دارند؟

    2- چه زمانی یک کلاس نیاز به مشتق گرفتن از IDisposable دارد؟

    3- چگونه متد Dispose رو پیاده سازی کنیم؟

    متشکرم
    هنگامی که کلاسی توسط CLR بارگذاری می شود تمامی متد های آن به همراه تمامی متدهای کلاس پدر و متدهای پیاده سازی شده از رابط های به ارث رفته در جدولی به نام جدول متد (Method Table) درج می گردند.
    حالا فرض کنید کلاسی داریم که IDisposable را پیاده سازی می کند که دارای یک متد Dispose است.

    public class Test : IDisposable     {         public void Dispose()         {             Console.WriteLine("Test.Dispose");         }     }

    وقتی این کلاس توسط CLR بارگذاری می شود همه توابع مجازی توسعه داده شده در جدول متد ثبت می شوند که در اینجا یک متد برای رابط IDisposable ثبت می شود و یک متد جدید نیز برای کلاس Test ثبت می شود.
    حالا زمانی که بخواهیم این متد را از نمونه شئ Test و یا استفاده از ارجاع رابط Dispose به مشکلی برخوریم. به مثال زیر دقت کنید :
    Test obj = new Test(); obj.Dispose(); IDisposable i = obj; i.Dispose();  //output //Test.Dispose //Test.Dispose


    توجه کردید که خروجی هر دو به یک صورت بود این به این خاطر است که کامپایلر C#‎ درهنگام کامپایل این متد را بررسی می کند و متوجه می شود که خروجی، امضاء و نوع دسترسی متد جدید در شئ Test با متد متناظر در رابط IDisposable یکسان است به همین دلیل متا دیتاهای هر دو متد را ادغام می کند که در اینصورت در جدول متد فقط یک متد ثبت می گردد که هر دو به این یک متد دسترسی دارند.
    پیاده سازی صریح توابع رابط یا explicit interface method implementation (EIMI) این قابلیت را فراهم می کند تا بتوان متد های مجازی توسعه یافته رابط و متد های یک شئ را از یکدیگر مجزا نمود و در جدول متد برای هر کدام اطلاعات مجزای ثبت نمود.
    در زیر پیاده سازی متد Dispose مربوط به رابط IDisposable و کلاس Test را بوسیله EIMI از یکدیگر مجزا نموده ایم
    public class Test : IDisposable     {         public void Dispose()         {             Console.WriteLine("Test.Dispose"); } void IDisposable.Dispose() { Console.WriteLine("IDisposable.Dispose"); } }


    وقتی که فراخوانی های از این متد ها انجام می دهید، خروجی به صورت زیر برگردانده می شود.
    Test obj = new Test(); obj.Dispose(); IDisposable i = obj; i.Dispose();  //output //Test.Dispose //IDisposable.Dispose



    در C#‎ ، هنگامی که نام یک رابط به همراه نام متد مربوطه در هنگام پیاده سازی درج می کنید (برای مثال IDisposable.Dispose )، آن متد EIMI نامیده می شود.
    در هنگام تعریف EIMI محدودیت های به صورت زیر وجود دارد

    • در هنگام پیاده سازی صریح یک تابع نمی توان نحوه دسترسی به آن را تعیین کرد (برای مثال public ویا private)
    • همچنین یک متد EIMI نمی تواند با Virtual برچسب بخورد پس توانایی بازنویسی (overide) از این متدها وجود ندارد.



    سناریو های مختلفی را می توان برای استفاه از EIMI بیان کرد به عنوان مثال دو رابط زیر را در نظر بگیرید که هر یک دارای متدی با امضاء ها و نوع های برگشتی یکسانی هستند :



    //using System.IO; public interface IReader { void SetStream(Stream stream); }






    //using System.IO; public interface IReader { void SetStream(Stream stream); }



    حالا می خواهیم که هر دو این رابط ها را در یک کلاس پیاده سازی بکنیم، اینکار را چطور انجام می دهید؟ در اینجور سناریو ها EIMI تنها انتخاب است.



    //using System.IO; public class TestReader : IReader, IWriter { Stream m_readerStream = null; Stream m_writerStream = null; void IReader.SetStream(Stream stream) { m_readerStream = stream; } void IWriter.SetStream(Stream stream) { m_writerStream = stream; } }



    حالا می توان از این متدها براحتی برای رابط های مربوطه استفاده نمود.



    IReader reader = new TestReader(); //reader.SetStream(stream) will set m_readerStream IWriter writer = new TestReader(); //writer.SetStream(stream) will set m_writerStream

  3. #3
    کاربر دائمی آواتار FastCode
    تاریخ عضویت
    تیر 1388
    محل زندگی
    /dev/null
    پست
    3,486

    نقل قول: چگونه از IDisposable استفاد کنیم

    جواب سوال سوم عالی بود(البته دقیقا جواب این سوال نبود).ولی با این حال چند وقت بود کسی این مقدار راجع به اینترفیس ها توضیح نداده بود.یاد قدیم افتادم.
    جواب سوال اول منفیه.
    ۲.
    شما فقط زمانی نیاز به implement کردن IDisposable دارید که کلاس شما مستقیما به منابع سیستم دسترسی داشته باشد یا مرجعی به کلاسی داشته باشد که مستقیما به منابع سیستم دسترسی داشته باشد و آزاد کردن منابع آن حیاتی باشد.خب این یعنی چی؟
    اول socket رو مثال میزنم.socket به منابع سیستم دسترسی دارد.و تا زمانی که Dispose نشود نمیتواند به سیستم عامل دستور بدهد که socket را ببندد.
    Stream رو مثال میزنم.Stream یک مقدار پیچیده تره.چون میتونه مستقیم به منابع سیستم وصل باشه یا از یک Stream دیگه استفاده کنه.به هر حال وقتی Dispose میشه اگر Base داشته باشه متود Dispose رو صدا میزنه.در غیر این صورت خودش به منابع دسترسی داره که در خیلی از مواقع باید بسته بشن(مثل فایل ها;FileStream). یا در خیلی از مواقع لازم نیست که بسته بشن(مثل MemoryStream).
    http://msdn.microsoft.com/en-us/library/fs2xkftw.aspx

    برای اینکه بیشتر با موضوع آشنا بشید پیشنهاد میکنم راجع به GC و مخصوصا Finalizer ها مطالعه کنید:
    http://stackoverflow.com/questions/2...ze-and-dispose
    http://stackoverflow.com/questions/1...t-and-finalize

    این رو هم جست و جو کن:(Google Image)
    .net Stream class hierarchy

  4. #4
    مدیر بخش آواتار مهرداد صفا
    تاریخ عضویت
    تیر 1391
    محل زندگی
    select Country,City From World where Country.Name=IRAN and City.Contains(حضرت معصومه(ع))
    پست
    1,502
    چشم ظاهر گر نبیند عیب نیست چشم دل گر ننگرد باید گریست
    **********
    اَلسَّلامُ عَلَى الْحُسَيْنِ وَ عَلى عَلِىِّ بْنِ الْحُسَيْنِ وَ عَلى اَوْلادِ الْحُسَيْنِ وَ عَلى اَصْحابِ الْحُسَيْنِ

تاپیک های مشابه

  1. چگونه Caller ID درست کنیم ؟
    نوشته شده توسط Apache66 در بخش برنامه نویسی در 6 VB
    پاسخ: 26
    آخرین پست: دوشنبه 11 بهمن 1389, 15:57 عصر
  2. چگونه DNN را فارسی کنیم
    نوشته شده توسط سار در بخش ASP.NET Web Forms
    پاسخ: 18
    آخرین پست: یک شنبه 06 اردیبهشت 1388, 14:25 عصر
  3. چگونه table را Cash کنیم
    نوشته شده توسط Mah6447 در بخش بانک های اطلاعاتی در Delphi
    پاسخ: 4
    آخرین پست: چهارشنبه 28 شهریور 1386, 20:43 عصر
  4. چگونه داده را وارد کنیم
    نوشته شده توسط lplnhg در بخش Access
    پاسخ: 2
    آخرین پست: پنج شنبه 01 دی 1384, 09:52 صبح
  5. Progress بار را چگونه به Query لینک کنیم ؟
    نوشته شده توسط MiRHaDi در بخش برنامه نویسی در Delphi
    پاسخ: 1
    آخرین پست: شنبه 07 شهریور 1383, 08:12 صبح

برچسب های این تاپیک

قوانین ایجاد تاپیک در تالار

  • شما نمی توانید تاپیک جدید ایجاد کنید
  • شما نمی توانید به تاپیک ها پاسخ دهید
  • شما نمی توانید ضمیمه ارسال کنید
  • شما نمی توانید پاسخ هایتان را ویرایش کنید
  •