সি # ফর্ম.ক্লস বনাম ফর্ম। ডিসপোজ


88

আমি সি # তে নতুন, এবং আমি আগের পোস্টগুলি দেখার চেষ্টা করেছি কিন্তু ভাল উত্তর পাই নি।

একটি সিতে উইন্ডোজ ফর্ম অ্যাপ্লিকেশনটি একটি একক ফর্ম সহ, Form.Close()আরও ভাল ব্যবহার করছে নাকি Form.Dispose()?

এমএসডিএন বলছে যে অবজেক্টের মধ্যে থাকা সমস্ত সংস্থান বন্ধ হয়ে যায় এবং যখন ক্লোজ করা হয় তখন ফর্মটি নিষ্পত্তি করা হয়। যার মধ্যেও, আমি অনলাইনে বেশ কয়েকটি উদাহরণ পেয়েছি যা বন্ধের পরিবর্তে ডিসপোজ অনুসরণ করে।

একজনের কি অন্যের চেয়ে সুবিধা রয়েছে? কোন দৃশ্যের অধীনে আমাদের একে অপরের চেয়ে বেশি পছন্দ করা উচিত?


সামান্য ভিন্ন প্রশ্ন, একই উত্তর, আইএমও: অর্থাত ক্লোজ এবং ডিসপোজ সাধারণত সমতুল্য, আপনি একাধিকবার ক্লোজ করতে পারেন।
ChrisW

4
@ ক্রিসউ: আপনি ডিসপোজকেও একাধিকবার কল করতে পারেন।
হেন্ক হলটারম্যান

@ ক্রিসডব্লিউ, ডিসপোজ একাধিকবার চালানোর জন্য ডিজাইন করা উচিত। bluebytesoftware.com/blog/…
স্টিভেন ইভার্স

আমার কাছে যে জিনিসটি পেয়েছে সেটি বন্ধ == ফর্মের পরিবর্তে নিষ্পত্তি === নিষ্পত্তি করুন is দৃশ্যমান = মিথ্যা; আমি আশা করছিলাম যে নিষ্পত্তি করার চেয়ে কাছাকাছি একটি নরম পদ্ধতি হবে।
পিট কিরখাম

4
@ পিট কির্খাম: form.Visible = false;আপনি চাইলে কল করতে পারেন form.Hide()। আসলে, form.Hide()সহজ সেট this.Visible = false;
ডার্ক ভোলমার

উত্তর:


172

এমএসডিএন-এ এই ফোরাম আপনাকে জানায়।

Form.Close()উইন 32 উইন্ডোটি বন্ধ করার জন্য যথাযথ উইন্ডোজ বার্তা প্রেরণ করে। এই প্রক্রিয়া চলাকালীন, যদি ফর্মটি মডেলভাবে না দেখানো হয় তবে ফর্মটিতে ডিসপোজ কল করা হয়। ফর্মটি নিষ্পত্তি করে ফর্মটি যে অপরিশোধিত সম্পদগুলি ধারণ করে তা মুক্ত করে।

আপনি যদি form1.Show()বা করেন তবে Application.Run(new Form1())ডিসপোজ Close()বলা হবে।

তবে আপনি যদি form1.ShowDialog() ফর্মটি Modally দেখাতে করেন তবে ফর্মটি নিষ্পত্তি হবে না এবং আপনাকে form1.Dispose()নিজের কল করতে হবে । আমি বিশ্বাস করি এটি কেবলমাত্র আপনার নিজেরাই ফর্মটি নিষ্পত্তি করার বিষয়ে চিন্তা করা উচিত।


1 ম সংস্করণটি উদ্ধৃতি অন্তর্ভুক্ত করেছে? ক্ষতিপূরণ +1
হেন্ক হলটারম্যান

@ প্রথম সংস্করণটি চুষে ফেলুন ... (দুঃখিত @ কাইরা)
jjnguy

13
এটি কিছুটা এমএসডিএন-এর মতো নয় যেমন এমএসডিএন.মাইক্রোসফ্ট.কম / en-us / library /… তে বলেছে : " ক্লোজে কোনও ফর্ম নিষ্পত্তি না করার এক শর্তটি যখন এটি মাল্টিপল-ডকুমেন্ট ইন্টারফেসের (এমডিআই) অংশ হয় অ্যাপ্লিকেশন এবং ফর্মটি দৃশ্যমান নয়। এক্ষেত্রে আবর্জনা সংগ্রহের জন্য ফর্মের সমস্ত নিয়ন্ত্রণ চিহ্নিত করার জন্য আপনাকে ম্যানুয়ালি ডিসপোজ কল করতে হবে " যাইহোক, মডেল ফর্মগুলি কোনও সাধারণ নমুনা দিয়ে নিষ্পত্তি করা হয় কি না তা পরীক্ষা করা সহজ হওয়া উচিত।
ডার্ক ভোলমার


15

একটি সাধারণ নিয়ম হিসাবে, আমি সর্বদা স্পষ্টভাবে যে কোনও শ্রেণীর যেটি সরবরাহ করে তা ডিসপোজ পদ্ধতিতে কল করার পক্ষে কথা বলি, হয় পদ্ধতিটি সরাসরি কল করে অথবা "ব্যবহার" ব্লক মোড়কে।

প্রায়শই, আইডিস্পোসিবল বাস্তবায়নকারী ক্লাসগুলি এমনটি করে কারণ তারা কিছু ব্যবস্থাপনীত সম্পদকে আবৃত করে যা মুক্ত করতে হবে। এই ক্লাসগুলির চূড়ান্তকরণকারী থাকা উচিত যা সেফগার্ড হিসাবে কাজ করে, ডিসপোজকে কল করা সেই স্মৃতিটিকে আগে এবং নিচের ওভারহেড দিয়ে মুক্ত করতে সহায়তা করবে।

ফর্ম অবজেক্টের ক্ষেত্রে, যেমনটি লিঙ্কটি ফ্রি কিয়ারা উল্লেখ করেছে, ক্লোজ পদ্ধতিটি আপনার পক্ষ থেকে ডিসপোজ প্রার্থনা করার জন্য নথিভুক্ত করা হয়েছে যাতে আপনার স্পষ্টভাবে এটি করার দরকার নেই। যাইহোক, আমার কাছে, এটি সর্বদা বাস্তবায়নের বিবরণে নির্ভর করার মতো মনে হয়েছে। আমি তাদের ক্লাসগুলি ক্লোজ করার জন্য ক্লোজ এবং ডিসপোজ উভয়কে সর্বদা কল করতে পছন্দ করি, প্রয়োগের পরিবর্তনগুলি / ত্রুটি থেকে রক্ষা করার জন্য এবং পরিষ্কার হওয়ার জন্য। একটি সঠিকভাবে প্রয়োগ করা নিষ্পত্তি পদ্ধতি একাধিকবার আহ্বান জানাতে নিরাপদ হওয়া উচিত।



6

Closeসম্ভবত বাইপাসগুলিকে কল না করা একগুচ্ছ Win32 বার্তা প্রেরণ করছে যা কেউ মনে করবে কিছুটা গুরুত্বপূর্ণ যদিও আমি আপনাকে কেন নির্দিষ্ট করে বলতে পারছি না ...

Closeইভেন্টগুলি উত্থাপনের সুবিধা রয়েছে (যা বাতিল হতে পারে) যেমন কোনও বহিরাগত (ফর্মটিতে) সেই অনুযায়ী প্রতিক্রিয়া দেখাতে FormClosingও দেখতে পারে FormClosed

আপনি কেবল ফর্মটি নিষ্পত্তি করে দিলে FormClosingএবং / বা FormClosedউত্থাপিত হয়েছে কিনা তা আমি পরিষ্কার নই তবে আমি এটি পরীক্ষার জন্য আপনার কাছে রেখে দেব।


4
আপনি যদি ফর্মটি নিষ্পত্তি করেন তবে বন্ধ এবং বন্ধ ইভেন্টগুলি বলা হবে না।
ম্যাট্রিক্স



0

ক্লোজ () - পরিচালিত সংস্থান অস্থায়ীভাবে বন্ধ করা যেতে পারে এবং আবারও খোলা যেতে পারে।

নিষ্পত্তি () - স্থায়ীভাবে পরিচালিত বা পরিচালনা করা সম্পদ অপসারণ করে


4
ফর্মটি ব্যবহার করে দেখানো হলেই এটি সত্য ShowDialog()। অন্যথায়, Close()পাশাপাশি ফর্ম নিষ্পত্তি হবে।
পিটার ডুনিহো

-1

আপনি যদি নিজের ফর্মের মধ্যে form.close () ব্যবহার করেন এবং আপনার ফর্মের ফর্মক্লোজিং ইভেন্টটি সেট করেন এবং হয় এই ইভেন্টে form.close () ব্যবহার করেন, আপনি সীমাহীন লুপে পড়েছেন এবং আর্গুমেন্টটি সীমার বাইরে চলে গেছে এবং সমাধানটি হ'ল ফর্মটি পরিবর্তন করুন ফর্মক্লোজিংয়ের ইভেন্টে form.dispose () সহ .close ()। আমি আশা করি এই ছোট্ট টিপটি আপনাকে সহায়তা করবে !!!


-1

আমি সবেমাত্র ভিএস ডায়াগনস্টিক সরঞ্জামগুলির সাথে যা পরীক্ষা করেছি তা আমাকে এটাকে বলে। ক্লোজ () তারপরে ফর্মক্লোজিং ইভেন্টটি ট্রিগার হয়ে গেছে। তারপরে যখন আমি এটিকে কল করি Form ফর্মক্লোজিং ইভেন্টটির শেষে ডিসপোজ করুন () যেখানে আমি এর মধ্যে অন্যান্য অনেকগুলি জিনিস নিষ্পত্তি করি তখন এটি সবকিছুকে খুব মসৃণ করে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.