سلام
من برای سوالات دوستمف یکسری جواب داشتم تایپ میکردم، و حالا که امدن بفرستم، دیم کاربر mehdi لطف کردند و جوابی داده اند ....
خلاصه دیگر حال ویرایش مجدد ندارم
! متن زیر را میفرستم، با این توجه که در زمان تایپ پست mehdi را ندیده بودم.
==============
ولی این بخش دوم خیلی گویا نبود.
میشه example-oriented عمل کنید؟
خیلی واضح که بود ! ! ! ! !
یکم مثال بهتری میزنم، مثلاً به کد زیر دقت کنید...
کد:
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
شما میخواهید NewMethod2 را اجرا کنید،
اگر NewMethod2 را از ریسمان های غیر مجاز اجرا کنید با خطای Cross مواجه میشود،
ولی اگر NewMethod را از هر ریسمانی اجرا کنید، فرقی ندارد و بدون مشکل همان دستورات NewMethod2 در نهایت اجرا خواهد شد.
یادآوری میکنم که m_controlvariant میتوانید هر کنترلری از ریسمان مورد نظر باشد، حتی از یک فرم دیگر و یا خود یک فرم و...
این الگوریتم را باید درک کنید و با تغییرات لازم استفاده کنید.
==============
1- من وقتی یه متغیر رو مثلاً []String تعریف می کنم، اصولی ترین راه از بین بردنش چیه؟
وقتی کارم باهاش تموم شد، مساری null بکنم؟ یا روش بهتری هم هست؟
از شنیدن برخی دستورات و دقتی که فرد پرسنده دارد، آدم خوشحال میشود و این از همان موارد است !
اصولاً نیاز به اجرای دستور خاصی نیست و همان null کافی است، ضمن اینکه null هم در زمانی که خروج از حوزه دید رخ میدهد خودکار انجام میشود و مهم نیست.
مثلاً این null کردن بیهوده است و معنی ندارد !
طبیعتاً با رسیدن به انتهای T1 متغییرها از حوزه کاری خارج میشوند و به نوعی خودکار مرجعشان نابود و از مراجع شی کسر میشود (مشابه همان عمل null)
کد:
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
در واقع وقتی هیچ متغییری در برنامه وجود نداشته باشد که به محل یک شی کلاس در RAM اشاره کند و از آن استفاده کند، جمع آورنده حافظه هرز آن شی را تحویل میگیرد و آزاد میکند.
البته اگر حافظه مورد نظر زیاد است و اصرار هم دارید که زودتر آزاد شود (دیگر خیلی وسواس هستید !) میتوانید متد System.GC.SuppressFinalize را هم اجرا کنید.
کد:
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
ولی در کل نیازی به این کارها نیست و در مورد اشایی که واسط IDisposable را ندارد، مسئولی برای نابود سازی بر عهده شما نیست و میتوانید به garbage اعتماد کنید.
==============
من به []Byte دارم که طولانیه و 2 - 3 بار توش این نوشته شده "salam"
(الیته توجه دارید که، هر حرف در یک درایه اش)
من این رو چجوری می تونم splitش کنم؟
که به 3 - 4 قسمت تقسیم سه و اون salam بشه delimiterش؟
راه تعریف شده داره؟
من دستور و متد آماده ای برای این کار نمیشناسم.
اگر واقعاً محتویات آرایه []byte شما متنی است پیشنهاد میکنم تجدید نظری کنید.
دیگر Ascii فرمت چندان رایجی نیست و فرمت های Unicode و مخصوصاً UTF8 رایجتر است...
دات نت حدود 6 فرمت مختلف را با کمک کلاس System.Text.Encoding پشتیبانی میکند.
این فرمتها دیگر سادگی آن یک به یکی Ascii را شاید نداشته باشند و بهتر است تبدیلات []byte به/از []char و string را به عهده دات نت بگذارید.
نگه داری اطلاعات به صورت []char و string ضمن پشتیبانی کامل Unicode و تمام فرهنگ ها و متون به شما این امکانات را میدهد تا از توابع رشته ای دات نت در خصوص کار پردازش متنی خود کمک بگیرید.
مثلاً کلاس string چندین متد آماده Split دارد.
و در واقع کلاس string معادل []char است.
در کل بهتر است از ساختارهای string و []char و System.Text.StringBuilder و System.Text.Encoding برای پردازش متن استفاده کنید.
==============
اگر برای Generic List از نوع byte هم بشه، باز هم خوبه
راستی، در کل استفاده از Generic List روش خوبیه؟
مشکل خاصی ندارد !
البته باید بدانید که کلاسی مثل System.Collections.Generic.List چیبز خاص و خارق العاده و استثنایی ندارد.
کد خود این کلاسها با خود دات نت و همین کلمات کلیدی و امکانات نوشته شده ...
همین کلاس در واقع ...
- اطلاعات را در یک آرایه معمولی نگه میدارد.
- یک آرایه که معمولاً کمی بزرگتر است و در انتهایش عناصر خالی ای برای Add و Insert های بعدی دارد.
- اگر طی عمل Insert و Add آرایه گنجایش کافی و جای خالی بیشتری نداشته باشد، کلاس آرایه ای جدید با ابعاد دو برابر میسازد و عناصر آرایه قبلی را در آرایه جدید بزرگتر با جای خالی بیشتر کپی میکند و آرایه قبلی را رها میکند.
- اگر عمل Add باشد، عنصر جدید به اولین جای خالی آرایه در انتهای آن اضافه میشود.
- اگر عمل Insert در وسط آرایه باشد، عناصر آرایه از آن محل یک واحد به سمت آخر حرکت داده میشوند تا جایی خالی در وسط ایجاد شود.
- اگر عمل Delete باشد، در واقع عناصر از اخر به محل مورد یک واحد حرکت داده میشوند تا نقطه مورد نظر را پر کنند.
خلاصه این مکانیزم کار کلاس فوق بود، حالا میتوانید راجب استفاده ان تصمیم بگیرید.
طبیعتاً ...
- سرعت خیلی کمتری از آرایه مستقیم دارد
- سرعت Add خوبی دارد، مخصوصاً که capacity زیادی داشته باشد.
- سرعت Insert و Delete کم است و نیازمند حرکت عناصر است.
البته الگوریتم و روش فوق در خصوص اغلب collection ها صادق است (بجز نوع Linked که الگوریتم دیگری دارند.)
و البته از بین Collection های دات نت System.Collections.Generic.List یکی از بهترین و پراستفاده ترین آنها است.
که کد نهایی شما فقط و فقط یک لایه با منبع پایه ای اصلی ذخیره اطلاعات در RAM (که همان آرایه باشد) فاصله پیدا میکند.
و همانطور که آرایه پایه نگه داری اطلاعات در System.Collections.Generic.List و System.Collections.List است.
پایه نگه داری اطلاعات در خیلی از کلاسهای سطح بالاتر دات نت همین دو کلاس فوق است.
(مثلاً وقتی نام فایلها یک پوشه را با GetFiles میگیرد، کدهای داخلی برای ذخیره موقت نام ها و اسکن (پیمایش) تمام نامها تا انتها از System.Collections.Generic.List استفاده میکنند و...)
دیگر تصمیم استفاده با در نظر گرفتن شرایط خودتان و شرایط کلاس فوق به عهده خودتان است. !