PDA

View Full Version : سوال: چگونگي حذف متدي كه شي مربوطه اش حذف شده است .



Programmer 1
یک شنبه 31 مرداد 1389, 20:00 عصر
سلام ،

فرض كنيد يك دكمه در فرم قرار مي دهيم و به خاصيت Name آن دست نمي زنيم و در همين حال براي رويداد كليك آن كدي قرار ميدهيم ،
بعد از اين كار خاصيت Name دكمه را تغيير ميدهيم مثلا : btnOpen و روي آن دوبار كليك ميكنيم تا رويداد كليك آن فراخواني شود ، مي بينيم كه دقيقا به همان محل كد قبلي ميرويم و برنامه هم به درستي اجرا مي شود ولي تابع مربوط به رويداد تغيير نام نداده است :
مثلا انتظار دارم كه نام تابع تبديل به (private void btnOpen _Click(object sender, EventArgs e شود . حال براي تغيير نام خودكار بايد چه كار كنيم ، استفاده از Replace به نظرم اصلا كار درستي نيست ، چون وقتي تعداد خطوط كد زياد بشه ،‌ دردسر سازه ، بايد يك راه حلي وجود داشته باشه كه اميدوارم شما دوستان جواب بديد ، خيلي برام جالبه كه بدونم دليل اين كار چيه كه به صورت اتوماتيك تابع تغيير نام داده نميشه! .

همچنين اگر همان دكمه را حذف كنيم چرا متد مربوط به آن به صورت خودكار حذف نمي شود و گاهي اوقات مشكل ساز ميشه . چه طوري بايد طوري تنظيم كنيم كه به صورت خودكار متد مربوطه را هم حذف كند ؟.


با تشكر /.

mo.esmp
یک شنبه 31 مرداد 1389, 21:29 عصر
خوب متد یعنی کدی که نوشته شده و کامپایل شده و پس از اجرا شدن برنامه اونم لود میشه میره تو حافظه دیگه با حذف یک کنترل از یک فرم در زمان اجرا لزوما کنترل از فرم حذف میشه و فکر نکنم Event های مربوط به کنترل از بین بروند. راهی که به نظر من میرسه اینکه که ابتدا Event های مربوط به کنترل رو از کنترل حذف کنید و سپس کنترل رو از فرم حذف کنید.

vcldeveloper
دوشنبه 01 شهریور 1389, 01:56 صبح
خيلي برام جالبه كه بدونم دليل اين كار چيه كه به صورت اتوماتيك تابع تغيير نام داده نميشه! .
چون شما ممکنه در بخش های مختلفی از کدتون اون متد رو فراخوانی کرده باشید، یا خودتان یک نام مناسب به آن اختصاص داده باشید، و تمایلی نداشته باشید که با تغییر نام کنترل مربوطه، نام متد متصل به Event مورد نظر شما هم تغییر کنه (بخصوص زمانی که چند کنترل برای یک رویداد از یک متد مشترک استفاده می کنند). اون وقت، اگر IDE به طور خودکار نام متد رو تغییر بده، هر جا که در کد از اون متد استفاده کرده باشید، کامپایلر ازتون ایراد میگیره، و باید همه آنها را تغییر نام بدید.

اگر هم IDE بخواد به طور خودکار همه این کار رو براتون انجام بده، کار پر هزینه ایی برای یک تغییر نام ساده هست، بخصوص که، همانطور که در بالا اشاره کردم، ممکنه اصلا قصد شما تغییر نام متد مربوطه نبوده باشه! اون وقت از دست IDE شاکی میشید که چرا بدون اجازه شما همچین کاری کرده.

اگر میخواد نام متدی رو در کل پروژه تغییر بدید، باید از گزینه Refactor | Rename استفاده کنید.



همچنين اگر همان دكمه را حذف كنيم چرا متد مربوط به آن به صورت خودكار حذف نمي شود و گاهي اوقات مشكل ساز ميشه .
اون متد متعلق به اون دکمه نیست که با حذف دکمه، اون متد هم حذف بشه. اون متد متعلق به کلاس فرم شما ست، و دکمه فقط از طریق رویداد Click خودش، یک اشاره گر به اون متد را نگهداری میکرده. IDE فقط موقع دابل کلیک کردن بر روی یک کنترل، این فرآیند را براتون ساده میکنه، یعنی یک متد در کلاس فرم تان تعریف میکنه، و آن را به رویداد Click کنترل مربوطه اختصاص میده، تا شما بتونید سریع و راحت کدنویسی تان را انجام بدید.

همچنین، همیشه متد اختصاص داده به یک Event توسط IDE ایجاد نمیشه، و ممکنه شما خودتون یک متدی نوشته باشید و به Event مربوطه اختصاص داده باشید، و البته هر متد هم لزوما مختص یک کنترل خاص نیست و ممکنه برای کنترل های مختلفی به عنوان Event-handler استفاده بشه؛ حالا شما تصور کنید، یک متدی را با کلی زحمت نوشتید، و به رویداد Click یکی از کنترل های فرم تان اختصاص دادید، یا یک متدی را نوشتید از آن به عنوان Event-handler در چند کنترل استفاده کردید، سپس فقط یکی از این چند کنترل را حذف کردید، و IDE هم کل آن متد را حذف کرد، اون وقت چه حالی بهتون دست میده؟!

برای کار با Eventها بهتره درک درستی از مقدمات کار کردشون داشته باشید. یک Event خصوصیتی از یک کلاس هست، که میتونه آدرس یک (یا در #C چند) متد را داشته باشه. وقتی به Event مقدار می دید، در واقع یک Even-handler براش تعیین می کنید. این Event-handler یک متد از یک کلاس هست، و Event شما آدرس این متد را ذخیره میکنه. هر زمان که رویداد مربوط به اون Event رخ بده (مثلا همان کلیک کردن)، کلاس شما متدی که آدرسش در Event مربوطه ذخیره شده را فراخوانی میکنه، و اون متد اجرا میشه.

#aliyari_C
دوشنبه 01 شهریور 1389, 06:25 صبح
ُسلام
با روش زیر می تونیم نام یک نوشتار معتبر را در جایگزین همان نوشتار کنیم (Replace)
http://www.csharpkey.com/csharp/editor/rename2.gif
بعدش
http://www.csharpkey.com/csharp/editor/rename2b.gif

یا
http://www.csharpkey.com/csharp/editor/rename1.gifوبعدش
http://www.csharpkey.com/csharp/dlgboxes/rename1.gif

شرمنده که بدون توضیح , خودمم بدون توضیح یاد گرفتم.

موفق باشی
__________________________________________________ __________________________________________________
چون به دریا می توانی راه یافت
سوی یک قطره چرا باید شتافـت

نتایج آماری,مقایسه ای بین String و StringBuildr (http://www.barnamenevis.org/forum/showthread.php?t=233987)

Programmer 1
سه شنبه 02 شهریور 1389, 19:46 عصر
ممکنه اصلا قصد شما تغییر نام متد مربوطه نبوده باشه!

ضمن تشكر بابت پاسخ هاي منطقي شما ، ولي اين جمله رو درست درك نكردم كه چرا ممكنه ما قصد تغيير نام متد را نداشته باشيم ، اين كار چه سودي داره مثلا در چه موري مي تونه كاربرد داشته باشه چون با اين كار به نظر مي آد تو كار مستند سازي هم مشكلاتي ايجادي بشه ، اين جوري درك كد برنامه هم دشوارتر مي شه يعني مثلا فرض كنيد دكمه اي ايجاد كرديم و در رويداد كليك مربوط به اون هم كدهايي رو قرار داديم و حالا نام كنترل رو تغيير ميديم و IDE هم نام متد را طبق اين گفته تغيير نمي ده و ما هم نام متد مربوطه رو در كد فراموش ميكنيم تغيير بديم ، بعد ها كه به كد موجود در مستندات نرم افزار مراجعه ميكنيم مي بينيم كه رويداد كليك دكمه اي كه نامش رو هم تغيير داديم شامل كدهايي هست ، حالا به مستندات طراحي نرم افزار مراجه ميكنيم تا كنترلي با اين نام رو پيدا كنيم ولي پيدا نمي كنيم و اينجا يك مشكل در تحليل كد به وجود مي آد ، خوب وقتي به خاطر يك فراموشي چنين مشكلاتي به وجود مي آد چرا بايد IDE اين كار رو بكنه ، به نظرتون اين يك اشكال در IDE مي تونه باشه ؟! .

با تشكر فروان /.

vcldeveloper
چهارشنبه 03 شهریور 1389, 04:51 صبح
ولي اين جمله رو درست درك نكردم كه چرا ممكنه ما قصد تغيير نام متد را نداشته باشيم ، اين كار چه سودي داره مثلا در چه موري مي تونه كاربرد داشته باشه چون با اين كار به نظر مي آد تو كار مستند سازي هم مشكلاتي ايجادي بشه ، اين جوري درك كد برنامه هم دشوارتر مي شه يعني مثلا فرض كنيد دكمه اي ايجاد كرديم و در رويداد كليك مربوط به اون هم كدهايي رو قرار داديم و حالا نام كنترل رو تغيير ميديم و IDE هم نام متد را طبق اين گفته تغيير نمي ده و ما هم نام متد مربوطه رو در كد فراموش ميكنيم تغيير بديم ، بعد ها كه به كد موجود در مستندات نرم افزار مراجعه ميكنيم مي بينيم كه رويداد كليك دكمه اي كه نامش رو هم تغيير داديم شامل كدهايي هست ، حالا به مستندات طراحي نرم افزار مراجه ميكنيم تا كنترلي با اين نام رو پيدا كنيم ولي پيدا نمي كنيم و اينجا يك مشكل در تحليل كد به وجود مي آد ، خوب وقتي به خاطر يك فراموشي چنين مشكلاتي به وجود مي آد چرا بايد IDE اين كار رو بكنه ، به نظرتون اين يك اشكال در IDE مي تونه باشه ؟! .
یک نمونه اش را در پست قبلی توضیح دادم؛ زمانی که از یک متد به عنوان Event-handler چند کنترل استفاده می کنید، وقتی اسم یکی از این کنترل ها را تغییر میدید، معمولا انتظار ندارید که اسم اون متد هم با اون کنترل تغییر کنه، چون اون متد به چند کنترل دیگه هم وصل هست.