"নিষ্পত্তি করা" শুধুমাত্র অনিয়ন্ত্রিত সংস্থান ধারণকারী ধরনের জন্য ব্যবহার করা উচিত?

আমি সম্প্রতি নিষ্পত্তি এর মান এবং IDISposable প্রয়োগ করে এমন ধরণের মান সম্পর্কে একটি সহকর্মী নিয়ে আলোচনা করছিলাম।

আমি যত তাড়াতাড়ি সম্ভব পরিষ্কার করার জন্য IDisposable বাস্তবায়নের মান আছে বলে মনে করি, এমনকি পরিষ্কার করার জন্য কোনও পরিচালিত সংস্থান না থাকলেও

আমার সহকর্মী ভিন্নভাবে চিন্তা করে; IDisposable প্রয়োগ করা হচ্ছে যদি আপনার কাছে কোনও পরিচালিত সংস্থান না থাকে তবে আপনার টাইপ অবশেষে আবর্জনা সংগ্রহ করা হবে।

আমার যুক্তি ছিল যে যদি আপনি যত তাড়াতাড়ি সম্ভব বন্ধ করতে চান এমন একটি ADO.NET সংযোগ থাকে, তবে নতুন মাইটিং উইথ্যাকোকেশন() ব্যবহার করে আইডিসপোজেবল এবং প্রয়োগ করা উচিত। আমার সহকর্মী জবাব দিল যে, কভারের অধীনে, একটি ADO.NET সংযোগ একটি অপ্রয়োজনীয় সংস্থান । তার উত্তরের প্রতি আমার উত্তর ছিল যে সবশেষে সবকিছুই একটি পরিচালিত সম্পদ

আমি সুপারিশযোগ্য ডিসপোজেবল প্যাটার্ন সম্পর্কে সচেতন যেখানে আপনি বিনামূল্যে পরিচালিত এবং অপ্রয়োজনীয় সংস্থান নিষ্পত্তি করুন বলা হয় তবে চূড়ান্ত নির্মানকারী/বিধ্বংসী এর মাধ্যমে কল করা হলে শুধুমাত্র বিনামূল্যে পরিচালিত সংস্থানগুলি (এবং কিছুক্ষণ পূর্বে কীভাবে < a href = "http://stevedunns.blogspot.co.uk/2009/03/idisposable-alerts.html"> আপনার আইডিস্পোজেবল ধরনের অনুপযুক্ত ব্যবহারের গ্রাহকদের সতর্ক করুন )

সুতরাং, আমার প্রশ্ন হচ্ছে, যদি আপনার এমন একটি টাইপ আছে যা অনিয়ন্ত্রিত সংস্থানগুলি ধারণ করে না তবে এটি IDisposable প্রয়োগ করা কতটা কার্যকর?

64
একমাত্র অন্য সময় আমাকে কখনই আইডিসপোজেবল প্রয়োজন হয় না, অপ্রয়োজনীয় সংস্থার বাইরে, আমি যখন নিশ্চিত করতে পারি যে ঘটনাগুলি সঠিকভাবে সদস্যতা ছাড়িয়ে নেওয়া হয় তাই একটি বর্গ আবর্জনা সংগ্রহ করা যেতে পারে। কিন্তু এটি আসলেই ভাষাটির ব্যর্থতা: ঘটনাগুলি আসলেই সত্যি দুর্বল-রেফারেন্স হওয়া দরকার, কিন্তু তারা তা নয়।
যোগ লেখক BlueRaja - Danny Pflughoeft, উৎস
@ হেনক আমি এটা বোঝাতে চেয়েছিলাম - আমি এটিকে আরও সাবধান করে দিয়েছি কিন্তু প্রশ্নে এটি সঠিকভাবে সঠিকভাবে অনুবাদ করা হয়েছে।
যোগ লেখক Konrad Rudolph, উৎস
আপনি সঠিকভাবে উল্লেখ করেছেন, একটি ADO সংযোগ হল একটি পরিচালিত সংস্থান।
যোগ লেখক Konrad Rudolph, উৎস
@ কোনরাডরুডলফ - না। একটি সংযোগকে পরিচালিত সম্পদ বলা হয়। এটি একটি unmanaged সম্পদ রয়েছে (মালিকানাধীন), যদিও সম্ভবত একটি পরোক্ষভাবে একটি সেফহ্যান্ডেল মাধ্যমে।
যোগ লেখক Henk Holterman, উৎস

15 উত্তর

IDisposable এর জন্য বিভিন্ন বৈধ ব্যবহার রয়েছে। একটি সহজ উদাহরণ একটি খোলা ফাইল ধারণ করা হয়, যা আপনি কিছু মুহূর্তে বন্ধ করতে হবে, যত তাড়াতাড়ি আপনি এটি প্রয়োজন হবে না। অবশ্যই, আপনি একটি কোড বন্ধ করুন সরবরাহ করতে পারেন, তবে এটি নিষ্পত্তি করুন এবং ব্যবহার করে প্যাটার্ন ব্যবহার করে (var f = new MyFile (path)) {/ * এটি প্রক্রিয়া করুন * /} আরো ব্যতিক্রম-নিরাপদ হবে।

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

সাধারণভাবে, যত তাড়াতাড়ি আপনি কিছু সংকল্পগত ধ্বংস করতে চান, আপনাকে আইডিসপোজেবল প্রয়োগ করতে হবে।

আমার মতামত ও আপনার মধ্যে পার্থক্য হল যে আমি আইডিসপোজেবল প্রয়োগ করি যত তাড়াতাড়ি কিছু সংস্থার প্রয়োজন নির্ধারক ধ্বংস/মুক্ত করা প্রয়োজন যত তাড়াতাড়ি সম্ভব । আবর্জনা সংগ্রহের উপর নির্ভর করে এই ক্ষেত্রে একটি বিকল্প নয় (আপনার সহকর্মীর দাবির বিপরীতে), কারণ এটি সময়ের অপ্রত্যাশিত মুহুর্তে ঘটতে পারে এবং আসলে এগুলি ঘটতে পারে না!

কভারের অধীনে যে কোনও সংস্থানকে পরিচালনা করা হয় তা আসলেই এর অর্থ নয়: বিকাশকারীটি "কভারের অধীনে কীভাবে কাজ করে?" এর পরিবর্তে "কখন এবং কিভাবে এই বস্তুর নিষ্পত্তি করা যায়" এর শর্তে মনে করা উচিত। অন্তর্নিহিত বাস্তবায়ন যাইহোক সময় সঙ্গে পরিবর্তন হতে পারে।

প্রকৃতপক্ষে, সি # এবং সি ++ এর মধ্যে প্রধান পার্থক্যগুলির মধ্যে একটি হল ডিফল্ট সংকল্পগত ধ্বংসের অনুপস্থিতি। আইডিসপোজেবল ফাঁকটি বন্ধ করার জন্য আসে: আপনি নির্ধারিত বিধিনিষেধটি ক্রমানুসারে করতে পারেন (যদিও আপনি এটি নিশ্চিত করতে পারেন না যে ক্লায়েন্টরা এটি কল করছে; সি ++ তেও একই ভাবে আপনি ক্লায়েন্টকে মুছতে </কোড> বস্তুর উপর)।


ছোট সংযোজন: নির্ধারক সম্পদগুলি মুক্ত করার এবং যত তাড়াতাড়ি সম্ভব মুক্ত করা সেগুলির মধ্যে পার্থক্য কী? প্রকৃতপক্ষে, যারা ভিন্ন (যদিও পুরোপুরি অরথোগনাল না) ধারণাগুলি।

যদি সংস্থানগুলি নির্ধারকভাবে মুক্ত করা হয় তবে এর মানে হল ক্লায়েন্ট কোডটি "এখন এই সংস্থানটি মুক্ত করতে চাইছে" বলার সম্ভাবনা আছে। এটি আসলে যত তাড়াতাড়ি সম্ভব মুহূর্ত হতে পারে না যখন সংস্থার মুক্ত হতে পারে: সংস্থার কাছে থাকা বস্তুটি সংস্থার কাছ থেকে প্রয়োজনীয় সবকিছু পেতে পারে, সম্ভবত এটি ইতিমধ্যে সংস্থাকে মুক্ত করতে পারে। অন্যদিকে, বস্তুটি নিষ্পত্তি এর মাধ্যমে সঞ্চালিত হওয়ার পরেও (সাধারণত অনিয়ন্ত্রিত) সংস্থাকে রাখার জন্য চয়ন করা যেতে পারে, এটি শুধুমাত্র চূড়ান্ত করার জন্য এটি পরিষ্কার করে (যদি দীর্ঘ সময়ের জন্য সংস্থান ধারণ করা না হয় তবে) কোন সমস্যা করা)।

সুতরাং, যত তাড়াতাড়ি সম্ভব সংস্থানটি মুক্ত করার জন্য, কঠোরভাবে বলুন, নিষ্পত্তি করুন প্রয়োজনীয় নয়: যত তাড়াতাড়ি এটি বুঝতে পারে যে সংস্থানটি সম্পদটিকে মুক্ত করতে পারে আরো প্রয়োজন। নিষ্পত্তি করুন তবে একটি কার্যকর ইঙ্গিত হিসাবে কাজ করে যে বস্তুটি নিজেই প্রয়োজন হয় না, তাই সম্ভবত যদি সেগুলি যথাযথ হয় তবে হতে পারে


আরও একটি প্রয়োজনীয় সংযোজন: এটি কেবলমাত্র অনিয়ন্ত্রিত সংস্থান নয় যা নির্ণায়ক নির্বাসন প্রয়োজন! এই প্রশ্নের উত্তরগুলির মধ্যে মতামতের পার্থক্যের মূল পয়েন্টগুলির মধ্যে এটি একটি বলে মনে হচ্ছে। এক বিশুদ্ধরূপে কল্পনাপ্রসূত গঠন থাকতে পারে, যা deterministically মুক্তি প্রয়োজন হতে পারে।

উদাহরণগুলি হল: কিছু ভাগ করা কাঠামো অ্যাক্সেস করার অধিকার ( RW-lock ), একটি বিশাল মেমরি খণ্ড (কল্পনা করুন যে আপনি নিজে প্রোগ্রামটির কিছু মেমরি পরিচালনা করছেন), অন্য কোন প্রোগ্রাম ব্যবহার করার লাইসেন্স (কল্পনা করুন যে আপনার X একযোগে কিছু প্রোগ্রামের কপি), ইত্যাদি। এখানে মুক্ত হওয়া বস্তুটি কোনও পরিচালিত সংস্থান নয় তবে একটি সঠিক কিছু করতে/ব্যবহার করতে, যা আপনার প্রোগ্রামের যুক্তিতে সম্পূর্ণভাবে অভ্যন্তরীণ গঠন।


ছোট সংযোজন: IDisposable ব্যবহার করে [আবু] সুনির্দিষ্ট উদাহরণগুলির একটি ছোট তালিকা এখানে রয়েছে: http://www.introtorx.com/Content/v1.0.10621.0/03_LifetimeManagement.html#IDisposable

35
যোগ
@ ব্লুরাজা-ড্যানিফ্লুঘাউফ্ট: আমি চাই যে লোকেরা "ফাইলগুলির মতো অনিয়ন্ত্রিত সংস্থান" ইত্যাদি বলে। যেহেতু এটি সম্পূর্ণরূপে পরিচালিত-কোড মহাবিশ্বের মধ্যে জিনিসগুলি থাকতে পারে যা নির্ধারণমূলক পরিচ্ছন্নতা প্রয়োজন। তালা এবং শক্তিশালী ঘটনাগুলির মতো জিনিসগুলি এমন সম্পদ যা নন-জিসি-ভিত্তিক ক্লিনআপ প্রয়োজন, তবে তারা পরিচালিত ফ্রেমের বাইরে কিছু অ্যাক্সেস করে না।
যোগ লেখক supercat, উৎস
@ ব্লুরাজ-ড্যানিফ্লুঘোফট: লকড বস্তুর এক্সক্লুসিভ অ্যাক্সেস হল একটি সংস্থান; যদি একচেটিয়া অ্যাক্সেসের অধিকার ধারণ করে এমন কোনও বস্তুটি রক্ষিত বস্তুটিকে অবহিত না করে পরিত্যক্ত হয় তবে এক্সক্লুসিভটি আর প্রয়োজন হয় না, তারপরে কেউ আর বস্তুটি ব্যবহার করতে পারবে না। ইভেন্টগুলির জন্য, যদি অনির্দিষ্ট সংখ্যক স্বল্পকালীন বস্তুগুলি দীর্ঘস্থায়ী বস্তুর ইভেন্টগুলির সদস্যতা নেয় তবে তারপরে তার পরেই পরিত্যক্ত হয় তবে এই ধরনের বস্তুগুলি অনির্ধারিত মেমরি লিক তৈরি করবে কারণ সেগুলি জীবদ্দশায় সংগ্রহের জন্য যোগ্য হবে না। দীর্ঘস্থায়ী বস্তু।
যোগ লেখক supercat, উৎস
@ এডাম: কেস 1 ঠিক সেই ক্ষেত্রেই হয় যখন অননুমোদিত সংস্থানগুলি পরিষ্কার করা যায়। কেস 2 আমার প্রশ্নের অরথোগনালাল, এবং যে কোনওভাবে একটি বাস্তব উদাহরণ হয় না।
যোগ লেখক BlueRaja - Danny Pflughoeft, উৎস
@supercat: একটি লক রিলিজ এবং তার সম্পদ পুনরুদ্ধার একই জিনিস নয়। তালা না শক্তিশালী ইভেন্টের সংকল্পগত ধ্বংস প্রয়োজন।
যোগ লেখক BlueRaja - Danny Pflughoeft, উৎস
কখন কখন আপনি নির্ধারিত সংবিধিবদ্ধ ধ্বংস, ফাইল এবং ডিবি সংযোগগুলির মতো অপ্রয়োজনীয় সংস্থার বাইরে থাকতে হবে? (ছোটখাট গ্রীইপ - বস্তুটি নিজেই নির্ধারিত হয় না শুধুমাত্র এটি ব্যবহার করা সম্পদগুলি ... এবং শুধুমাত্র সেই সংস্থানগুলি যদি পরিচালনা না করে থাকে)
যোগ লেখক BlueRaja - Danny Pflughoeft, উৎস
@ ব্লুরাজা-ড্যানিফ্লুঘাউফ্ট: সত্য, যদিও আপনি স্বনির্ধারিত সংস্থানগুলি সরাসরি বা বিমূর্তকরণের মাধ্যমে ব্যবহার করছেন কিনা তা নির্ভর করে প্যাটার্ন ভিন্ন। দ্বিতীয় হিসাবে, কোনও প্যাটার্ন যেখানে আপনার একটি এন্ট্রি এবং প্রস্থান বিন্দু উপযুক্ত। যদিও লক ইতিমধ্যে বিদ্যমান, ব্যবহার করে এর সাথে একই ধরণের আচরণ পুনরুত্পাদন করা সহজ হবে। এটি এমন কিছু বিষয়গুলির জন্যও উপকারী হতে পারে যেখানে আপনি সাময়িকভাবে পরিবর্তনশীল অবস্থায় রয়েছেন এবং এটি নিশ্চিত করতে চান যে এটি আবার পরিবর্তিত হচ্ছে ... উদাহরণস্বরূপ, মাউস কার্সার পরিবর্তন করা হচ্ছে। আপনি এটি কনস্ট্রাক্টারে পরিবর্তন করবেন এবং এটি নিষ্পত্তি করুন তে যা যাবেন তা পুনরায় সেট করুন।
যোগ লেখক Adam Robinson, উৎস
@ ব্লুরাজা-ড্যানিফ্লুঘোয়েফ্ট: আমার উত্তর দেখুন, কিন্তু সরাসরি উত্তর দেওয়ার জন্য: 1) যখন আপনি সেই সংস্থানগুলি IDisposable প্রয়োগ করেন বা IDisposable idiom প্রয়োগ করেন তখন অন্য বস্তুর দ্বারা পরোক্ষভাবে সেগুলি ব্যবহার করছেন (এবং ব্যবহার করে ব্লকটির সুবিধার্থে) যেকোনো কারণের জন্য ব্যবহার করা হয়।
যোগ লেখক Adam Robinson, উৎস
@ ব্লুরাজঃ কোনও সংস্থার নির্ধারিত ডিমান্ডের প্রয়োজন হতে পারে। এটি একটি টাস্ক টেবিল, বিশাল মেমরি খণ্ড, সহকর্মী কর্মীদের রিং সারিতে টোকেন, যাই হোক না কেন, একটি স্লট হতে পারে।
যোগ লেখক Vlad, উৎস

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

এটি লক্ষ্য করা গুরুত্বপূর্ণ যে 100% পরিচালিত বস্তুর সাথে শুধুমাত্র এমন বস্তুগুলিও কাজ করতে পারে যা পরিষ্কার করা দরকার (এবং IDisposable ব্যবহার করা উচিত)। উদাহরণস্বরূপ, একটি IENumerator যা একটি সংগ্রহের "সংশোধিত" ইভেন্টে সংযুক্ত থাকে সেটি আর প্রয়োজন হলে নিজেকে আলাদা করতে হবে। অন্যথায়, যদি সংখ্যার কিছু জটিল কৌশল ব্যবহার না করা পর্যন্ত, সংগ্রহকারীরা যতক্ষন না সংগ্রহের সুযোগ থাকবে ততক্ষণ সংখ্যার আবর্জনা সংগ্রহ করা হবে না। যদি সংগ্রহটি দশ লক্ষ বার গণনা করা হয়, তাহলে তার ইভেন্ট হ্যান্ডলারের সাথে এক মিলিয়ন এনক্যুটারেটর যুক্ত হবে।

উল্লেখ্য যে, কখনও কখনও কোনও কারণের জন্য নিষ্পত্তি ছাড়া কোনও বস্তু পরিত্যক্ত হয়ে যায়, সেক্ষেত্রে ক্লিনআপের জন্য ফিনলাইজারগুলি ব্যবহার করা সম্ভব। কখনও কখনও এই ভাল কাজ করে; someitmes এটা খুব খারাপ কাজ করে। উদাহরণস্বরূপ, যদিও Microsoft.VisualBasic.Collection সংশোধনকারী নিষ্পত্তি ছাড়া হাজার বার বার কোনও বস্তুকে "সংশোধিত" ইভেন্টগুলির থেকে সংখ্যার বিচ্ছিন্ন করার জন্য একটি চূড়ান্তকারী ব্যবহার করে, বা আবর্জনা সংগ্রহের ফলে এটি খুব ধীরে ধীরে পৌঁছাবে - কর্মক্ষমতা তুলনায় ধীর গতির অনেকগুলি আদেশ যা নিষ্পত্তি করে সঠিকভাবে ব্যবহৃত হলে ফলস্বরূপ।

17
যোগ
@SteveDunn: ধন্যবাদ। মনে হচ্ছে ব্যাপকভাবে বিশ্বাস করা হয়েছে যে "অনিয়ন্ত্রিত সংস্থান" শব্দটিতে "অনির্বাচিত" শব্দটি "অনিয়ন্ত্রিত কোড" এর সাথে কিছু করার আছে। বাস্তবতাটি হল দুটি ধারনা মূলত ওথোগোনাল। চূড়ান্তকরণ কিছুটা "পরিচ্ছন্নতা দায়িত্ব" বিষয়টিকে বিভ্রান্ত করতে পারে, কারণ তাদের ছাড়া "মহাবিশ্বের শেষ হওয়ার আগে" ভাষা কিছুটা আক্ষরিক হতে পারে। যদি ফাইনালাইজার ছাড়া কোনও বস্তু হ্যান্ডেলের একমাত্র অনুলিপি থাকে যা কোনও অ্যাক্সেসের অ্যাক্সেস দেয় এবং হ্যান্ডেল ছাড়াই এটি পরিত্যক্ত হয় তবে হ্যান্ডেলটি আক্ষরিকভাবে কখনও মুক্তি পাবে না।
যোগ লেখক supercat, উৎস
@ এডাম রবিনসন: ঘটনাক্রমে, উপরে উল্লেখিত <�কোড> সংগ্রহ বস্তুর কিছু বিরক্তিকর কুইক আছে যা ঐতিহাসিক সামঞ্জস্যের বাইরে অন্য কোনও উদ্দেশ্যে তার কার্যকারিতা সীমাবদ্ধ করে, এতে কিছু অনন্য সুবিধা রয়েছে। তাদের মধ্যে প্রধান, এটি একমাত্র অভিধান-আইশ সংগ্রহ যা কোন নির্দিষ্ট মাপদণ্ডটি সরিয়ে দেওয়ার আইটেমগুলিকে সরানোর আইটেমগুলির পৃথক তালিকা তৈরি না করেই সরানো সহজ করে।
যোগ লেখক supercat, উৎস
@ স্টেভডুনঃ অবশ্যই, হ্যান্ডেলটি মুক্তি পাওয়ার আগেই প্রশ্ন করা যেতে পারে যে মহাবিশ্বের শেষ হওয়ার আগেই কি খুব ভাল হয়ে উঠতে পারে, কিন্তু মূল বিষয়টি হল যে একবার এটির সমস্ত কপি চলে গেলে, কিছুই হ্যান্ডেল ছেড়ে দেবে না। অতএব, এটির একটি অনুলিপি সহ শেষ সত্তাটি অবশ্যই নিশ্চিত হওয়া দরকার যে এটি হ্যান্ডেলের অনুলিপি এখনও বিদ্যমান থাকলেও এটি মুক্তি পায়। ঘটনাক্রমে, পরিচালিত কোডের মধ্যে সম্পূর্ণরূপে "অনিয়ন্ত্রিত সংস্থার" আরেকটি ভাল উদাহরণ: লক।
যোগ লেখক supercat, উৎস
@ এন্ডি: স্থির। আমার মূল বিষয় হল যে অনেক লোক মনে করে যে "অনাক্রম্য সংস্থান" শব্দটির মানে "স্থানীয় কোড দ্বারা পরিচালিত সম্পদ", যখন এটি সত্য নয়। যদিও স্থানীয় কোড দ্বারা পরিচালিত সংস্থান প্রায় সবসময় অনিয়ন্ত্রিত সংস্থান হয়, তবে এটি কেবলমাত্র একমাত্র গুরুত্বপূর্ণ প্রকার। প্রকৃতপক্ষে, আমি সত্যিই "পরিচালিত সংস্থান" এবং "অনিয়ন্ত্রিত সংস্থান" শব্দগুলিকে অপছন্দ করি, কারণ তাদের অর্থের মধ্যে সামান্য সামঞ্জস্য রয়েছে। এমন কিছু যা নিজের বাইরে কোনও "ম্যানুয়াল রিসোর্স" হস্তচালিত করে না, নাকি সেই শব্দটি শুধুমাত্র চূড়ান্তকারীগুলির সাথে বস্তুর উল্লেখ করে?
যোগ লেখক supercat, উৎস
@ এডাম রবিনসন: সংগ্রহটি সংশোধন করার সময় মাইক্রোসফ্ট। ভিসুয়ালব্যাসিক। কলেকশন </কোড> ক্লাস 'এনক্যুটারেটর সাবস্ক্রিপশনের সাবস্ক্রাইব করে এবং সেই বিজ্ঞপ্তিগুলি ব্যবহার করে যাতে এটি সংবেদনশীলভাবে আচরণ করতে পারে। সংগ্রহ শ্রেণিতে যুক্তিযুক্ত রয়েছে যে যদি কোন সংখ্যাগরিষ্ঠ পরিত্যক্ত হয় তবে সাবস্ক্রিপশনগুলি পরবর্তী GC এ সাফ করা হবে তবে যদি কেউ সংগ্রহ অনেকগুলি (উদাহরণস্বরূপ হাজার) আবর্জনা সংগ্রহ চক্রের মধ্যে সময়, এটি খুব ধীর পেতে শুরু হবে। পরবর্তী সংগ্রহটি ঘটে গেলে, এটি দ্রুত গতিতে বাড়বে।
যোগ লেখক supercat, উৎস
ধন্যবাদ, আমি মনে করি আইনিউনারেটরের উদাহরণটি মনে হয় প্রতিশোধ হিসাবে!
যোগ লেখক Steve Dunn, উৎস
এফডব্লিউআইডব্লিউআইডব্লিউআইডব্লিউ, আমি এমন কোনও সংখ্যার অবগত নই যা এই পদ্ধতিতে সংগ্রহকে পর্যবেক্ষণ করে। তালিকা <�টি> এর জন্য সংখ্যার উদাহরণ, উদাহরণস্বরূপ, তালিকায় সংস্করণ পরিবর্তনশীল চেক করে। কিন্তু একটি বৈধ বিন্দু, তবুও।
যোগ লেখক Adam Robinson, উৎস
@supercat: আকর্ষণীয়! তবুও IDISposable s নিষ্পত্তি করার আরেকটি কারণ
যোগ লেখক Adam Robinson, উৎস
এমন বস্তুগুলি যা 100% অব্যবস্থিত বস্তুর সাথে শুধুমাত্র মিথস্ক্রিয়া করে সেগুলি 100% পরিচালিত বস্তুগুলি পড়তে হবে না? অন্যথায়, মহান উত্তর। যদি আপনার প্রয়োগকরণ আইডিসোপেজেবল এমন একটি উদাহরণের মালিকানাধীন থাকে তবে আপনাকে এটি পরিষ্কার করতে হবে এবং এটি পরিষ্কার করতে হবে এবং IDISposable এটিকে যোগাযোগ করার একমাত্র উপায়।
যোগ লেখক Andy, উৎস

সুতরাং, আমার প্রশ্ন হল, যদি আপনার এমন একটি টাইপ থাকে যা এতে না থাকে   unmanaged সম্পদ, এটা IDISposable বাস্তবায়ন মূল্য? </পি>

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

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

আমার সহকর্মী জবাব দিল যে, কভারের অধীনে, একটি ADO.NET সংযোগ একটি   পরিচালিত সম্পদ। তার উত্তরে আমার উত্তর ছিল সবকিছু শেষ পর্যন্ত   একটি unmanaged সম্পদ। </পি>

তিনি ঠিক, এটি এখন একটি পরিচালিত সম্পদ। তারা কি কখনো এটা পরিবর্তন করবে? কে জানে, কিন্তু এটি কল করতে আঘাত না। আমি চেষ্টা করি না এবং ADO.NET টিম কী করে তা অনুমান করে না, তাই যদি তারা এটি রাখে এবং এটি কিছুই না করে তবে এটি ঠিক আছে। আমি এখনও এটি কল করব, কারণ কোডের একটি লাইন আমার উত্পাদনশীলতাকে প্রভাবিত করবে না।

আপনি অন্য দৃশ্যকল্প মধ্যে চালানো। চলুন আপনি একটি পদ্ধতি থেকে একটি ADO.NET সংযোগ ফেরত বলুন। আপনি জানেন না যে ADO সংযোগটি বেস অবজেক্ট বা ব্যাট থেকে প্রাপ্ত হওয়া প্রকার। আপনি জানেন না যে IDISposable বাস্তবায়ন হঠাৎ প্রয়োজন হয়ে গেছে কিনা। আমি সবসময় এটা কোন ব্যাপার না, কারণ একটি উত্পাদন সার্ভারে মেমরি লিক নিচে ট্র্যাকিং যখন এটি প্রতি 4 ঘন্টা বিপর্যস্ত হয় sucks।

9
যোগ
অনেক ধরণের IDisposable প্রয়োগ করে না কারণ তারা ভবিষ্যতে সংস্করণটি এমনভাবে করতে পারে বলে আশা করে, কিন্তু কারণ তারা বা বেস টাইপটি ফ্যাক্টরি পদ্ধতিগুলির জন্য রিটার্ন টাইপ হিসাবে ব্যবহার করা যেতে পারে যা ক্লিনআপের জন্য প্রয়োজনীয় প্রকারগুলি ফেরত দিতে পারে। IENumerator বাস্তবায়নকারী সকল প্রকার, উদাহরণস্বরূপ, IDisposable প্রয়োগ করুন যদিও তাদের নিষ্পত্তি করুন পদ্ধতিগুলির অধিকাংশই কিছু না।
যোগ লেখক supercat, উৎস

ইতিমধ্যে এই ভাল উত্তর আছে, আমি শুধু স্পষ্ট কিছু করতে চেয়েছিলেন।

IDisposable প্রয়োগ করার জন্য তিনটি ক্ষেত্রে রয়েছে:

  1. আপনি সরাসরি পরিচালিত সংস্থান ব্যবহার করছেন। এটি সাধারণত একটি <�কোড> IntPrt বা একটি P/Invoke কল থেকে হ্যান্ডেলের অন্য কোন ফর্ম পুনরুদ্ধার করে যা একটি ভিন্ন P/Invoke কল দ্বারা প্রকাশ করতে হবে
  2. আপনি অন্য IDISposable বস্তুগুলি ব্যবহার করছেন এবং তাদের স্বভাবের জন্য দায়ী হতে হবে
  3. ব্যবহার করে ব্লকটির সুবিধা সহ আপনার কাছে এটির জন্য অন্য কোন প্রয়োজন বা ব্যবহার রয়েছে।

যদিও আমি একটু পক্ষপাতী হতে পারি তবে আপনাকে অবশ্যই (এবং আপনার সহকর্মীকে দেখানো উচিত) স্ট্যাকঅভারফ্লো উইকি আইডিসপোজেবল

6
যোগ
@ এডাম রবিনসন: "সর্বদা" কল সম্পর্কে <�স্পেস> আইডিসপোজেবল কিছু স্পষ্টতা থাকা উচিত। কোনও IDisposable এর শেষ রেফারেন্সের আগে নিষ্পত্তি করুন বলা উচিত তা গুরুত্বপূর্ণ (এটি পরে বলা যাবে না)। অন্যদিকে, অনেকগুলি বস্তুর জন্য IDisposable এর রেফারেন্স রাখা সাধারণ। সাধারণত, ঠিক একইভাবে নিষ্পত্তি করুন কল করুন।
যোগ লেখক supercat, উৎস
@supercat: হ্যাঁ, আপনি সঠিক। নিষ্পত্তিযোগ্য যে কোনও IDISposable জন্য একটি "মালিক" থাকা উচিত যা নিষ্পত্তি যথাযথভাবে আহ্বান জানানোর জন্য দায়ী।
যোগ লেখক Adam Robinson, উৎস
@ গাবে: এটি উইকি, তাই সম্পাদনা করতে বিনা দ্বিধায়। আমি আগে IObservable ব্যবহার করে নি, সুতরাং আপনি যদি কিছু যোগ করতে পারেন তবে এটি ভাল হতে পারে।
যোগ লেখক Adam Robinson, উৎস
আইডিসপিজেবল প্রয়োগ করার কারণ হিসাবে আমি জীবনকাল পরিচালনা অন্তর্ভুক্ত করার জন্য উইকি আপডেট করার সুপারিশ করছি। উদাহরণস্বরূপ, IObservable । IDISposable কে সাবস্ক্রাইব করুন ব্যবহার করে ব্যবহার করে ব্যবহার করা না থাকলেও এটি পরিচালনা করা হয় না।
যোগ লেখক Gabe, উৎস

না, এটি পরিচালিত সংস্থার জন্য নয় শুধুমাত্র

এটি ফ্রেমওয়ার্ক নামে একটি মৌলিক ক্লিনআপ বিল্ট-ইন পদ্ধতির মত প্রস্তাবিত, যা আপনাকে যে কোনও সংস্থানটি সাফ করার সম্ভাবনাকে সক্ষম করে তোলে, তবে এটি সর্বোত্তম মাপসই স্বাভাবিকভাবেই অপ্রয়োজনীয় সংস্থান পরিচালনা।

5
যোগ
@ হেনকহোল্টারম্যান: থেকে আমি এটা মনে হয় যে আমি কীভাবে ঠিক অর্থ বুঝিয়েছি: "এটি কেবল অমূল্য সম্পদ পরিচালনার জন্য নয়।" তাই না?
যোগ লেখক Tigran, উৎস
অস্ত্রোপচার. আমি সেখানে না পরিত্যাগ করেছি।
যোগ লেখক Henk Holterman, উৎস
বাস্তবায়ন (এবং কলিং) নিষ্পত্তি অধিকাংশ সম্পদ হোল্ডিং ক্লাসের জন্য সমালোচনামূলক। পরিচালিত/unmanaged বেশিরভাগ অপ্রাসঙ্গিক।
যোগ লেখক Henk Holterman, উৎস

Dispose should be used for any resource with a limited lifetime. A finalizer should be used for any unmanaged resource. Any unmanaged resource should have a limited lifetime, but there are plenty of managed resources (like locks) that also have limited lifetimes.

5
যোগ

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

IDiposable প্রয়োগ করা একটি প্রদত্ত শ্রেণীটি আসলে কিছু পরিষ্কার করতে হবে কিনা তা জানার কোন সহজ উপায় নেই। থাম্ব আমার নিয়ম সবসময় কিছু তৃতীয় পক্ষের লাইব্রেরি মত, আমি খুব ভাল জানি না এমন বস্তুতে <�কোড> নিষ্পত্তি </কোড> কল করতে হয়।

5
যোগ
কোনও বস্তুর নিষ্পত্তি করা সম্পত্তি থাকা সত্ত্বেও, যদি নিষ্পত্তি করুন প্রয়োজনীয় ছিল তা খুঁজে বের করতে সময় লাগবে (সামান্য) কল করতে প্রয়োজনীয় সময়টি অতিক্রম করবে > নির্বিশেষে নিষ্পত্তি করুন [যেহেতু এটি কেবলমাত্র একটি ভার্চুয়াল কল করার বিরোধিতা করে, তখন সম্পত্তিটির ভার্চুয়াল কল এবং ফলাফলের শাখাটি তৈরি করতে হবে]। নিষ্পত্তি করা একমাত্র সময় সহায়ক হবে যদি নিষ্পত্তি কল করতে যখন নির্ধারণ করা হবে এটি আসলে কল করার চেয়ে আরও বেশি কঠিন হবে (যেমন যদি একটি "ব্যবহারকারী" গণনা "পরিষ্কারের প্রয়োজন বস্তু প্রয়োজন হবে, কিন্তু না যারা না)।
যোগ লেখক supercat, উৎস

যদি আপনি আইডিসপোজেবল গুলি সমষ্টিগত করেন তবে আপনার ইন্টারফেসটি কার্যকর করা উচিত যাতে সেই সদস্যগুলি সময়মত ভাবে পরিষ্কার হয়ে যায়। অন্যথায় কিভাবে myConn.Dispose() ADO.Net সংযোগ উদাহরণে বলা যায় যা আপনি উল্লেখ করেন?

আমি মনে করি সঠিক নয় যে সবকিছুই একটি পরিচালিত সম্পদ এই প্রেক্ষাপটে যদিও। না আমি আপনার সহকর্মী সঙ্গে একমত।

3
যোগ

সবশেষে অবশেষে একটি পরিচালিত সম্পদ।

সত্য না. সিএমআর বস্তু দ্বারা ব্যবহৃত মেমরি ব্যতীত সবকিছু যা শুধুমাত্র ফ্রেমওয়ার্ক দ্বারা পরিচালিত (বরাদ্দ এবং মুক্ত) হয়।

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

এখন, সবাই তাদের উত্তর সঠিক বলে দাবি করে। আমাকে আমার প্রমাণ করুন আমার। ডকুমেন্টেশন অনুসারে:

অবজেক্ট। ফিনিলাইজ পদ্ধতি একটি বস্তুকে বিনামূল্যে সংস্থান করার চেষ্টা করে এবং অন্যান্য ক্লিনআপ অপারেশন সম্পাদন করে আবর্জনা সংগ্রহের মাধ্যমে এটি পুনরুদ্ধার করার আগে।

অন্য কথায় বস্তুর সিএলআর মেমরিটি শুধুমাত্র Object.Finalize() পরে বলা হয়। [নোট: প্রয়োজন হলে এই কলটি স্পষ্টভাবে বাদ দিতে পারে]

এখানে কোনও অপ্রয়োজনীয় সম্পদ নেই এমন একটি ডিসপোজেবল ক্লাস:

internal class Class1 : IDisposable
{
    public Class1()
    {
        Console.WriteLine("Construct");
    }

    public void Dispose()
    {
        Console.WriteLine("Dispose");
    }

    ~Class1()
    {
        Console.WriteLine("Destruct");
    }
}

Note that destructor implicitly calls every Finalize in the inheritance chain down to Object.Finalize()

এবং এখানে একটি কনসোল অ্যাপ্লিকেশন প্রধান পদ্ধতি:

static void Main(string[] args)
{
    for (int i = 0; i < 10; i++)
    {
        Class1 obj = new Class1();
        obj.Dispose();
    }

    Console.ReadKey();
}

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

দ্রষ্টব্য: বর্তমান কোড ডোমেনে চূড়ান্তকরণের জন্য মুলতুবি থাকা সকল বস্তু সংগ্রহ করতে GC জোর করার একটি উপায় রয়েছে তবে একটি নির্দিষ্ট নির্দিষ্ট বস্তুর জন্য নয়। তবুও আপনাকে চূড়ান্তকরণ সারিতে একটি বস্তু থাকতে নিষ্পত্তি করুন এ কল করতে হবে না। এটি দৃঢ়ভাবে সংগ্রহের জন্য নিরুৎসাহিত হয় কারণ এটি সম্ভবত সামগ্রিক অ্যাপ্লিকেশনের কর্মক্ষমতা ক্ষতিগ্রস্ত করবে।

সম্পাদনা করুন

একটি ব্যতিক্রম আছে - রাষ্ট্র পরিচালন। নিষ্পত্তি করুন আপনার অবজেক্ট বাইরের অবস্থায় পরিচালনা করার ক্ষেত্রে রাষ্ট্র পরিবর্তন পরিচালনা করতে পারে। এমনকি যদি রাষ্ট্রটি কোনও পরিচালিত বস্তু নয় তবে বিশেষ চিকিত্সা IDisposable এর মতো এটি ব্যবহার করা খুবই সুবিধাজনক। উদাহরণটি একটি সুরক্ষা প্রসঙ্গ বা ছদ্মবেশী প্রসঙ্গ হতে পারে।

using (WindowsImpersonationContext context = SomeUserIdentity.Impersonate()))
{
   //do something as SomeUser
}

// back to your user

এটি সেরা উদাহরণ নয় কারণ WindowsImpersonationContext অভ্যন্তরীণভাবে সিস্টেম হ্যান্ডেল ব্যবহার করে কিন্তু আপনি ছবিটি পান।

নিচের লাইনটি হল IDisposable প্রয়োগ করার সময় আপনার নিষ্পত্তি পদ্ধতিতে কিছু অর্থপূর্ণ করতে হবে (অথবা পরিকল্পনা করতে হবে)। অন্যথায় এটি শুধু সময় একটি বর্জ্য। আইডিসপোজেবল আপনার বস্তু জিসি দ্বারা পরিচালিত হয় না তা পরিবর্তন করে না।

3
যোগ
সংগ্রহটি সংশোধন করার অধিকার একটি অব্যবস্থাপিত সংস্থান, যদি এক বস্তুর উপর এই ধরনের অধিকার দান করা অন্যান্য বস্তুর সেই সংগ্রহটি সংশোধন করার ক্ষমতাকে ক্ষতিগ্রস্ত করে, যতক্ষণ না এই অধিকারটি প্রাপ্ত অধিকারটি নির্দেশ করে যে এটি আর প্রয়োজন হয় না। সবশেষে, অপারেটিং সিস্টেম থেকে অপ্রয়োজনীয় মেমরির একটি ব্লকের অনুরোধ করার জন্য এটি আসলে কোনও বস্তুর অর্থ কী? (1) অপারেটিং সিস্টেমটি যে মেমরি ব্যবহার করার অধিকার দেয় এবং (2) অন্য কেউ এটি করতে সক্ষম হবে না প্রথম অবজেক্টটি OS কে বলবে না যতক্ষণ না এটি আর প্রয়োজন হয়?
যোগ লেখক supercat, উৎস
@ ভ্লাদ আপনি আমার উত্তরের কিছু অংশ মিস করেছেন। আপনি যে সকল "কিছু" উল্লেখ করেছেন তা শেষ অব্যবস্থাপিত সংস্থানে রয়েছে। যদি আপনার বস্তু তাদের সাথে (সরাসরি বা পরোক্ষভাবে নির্ভরশীল বস্তুর মাধ্যমে) সম্পর্কিত হয় তবে এটি একটি পরিচালনাহীন হয়ে ওঠে এবং নিষ্পত্তি করুন প্রয়োগ করা উচিত। অন্যথায় যদি কোনও নির্ভরশীল বস্তু আপনার কোডটি নিষ্পত্তি করে প্রয়োগ করে। যে স্পষ্টভাবে নির্দেশ করা হয় না যদি দুঃখিত।
যোগ লেখক Maciej D., উৎস
ডিসপ্লে ব্যবহার করে পরিচালনাকারী রাষ্ট্রটি অপরিকল্পিত সংস্থার জন্য বোঝানো হ'ল হাইজ্যাকিংয়ের প্যাটার্ন নিষ্পত্তি করে। তবে আমি কখনও কখনও এটি ঘটতে এবং এটি সুবিধাজনক কারণ ব্যবহার করে কীওয়ার্ডের কারণে আমি সম্মত। উত্তর আপডেট করা হচ্ছে।
যোগ লেখক Maciej D., উৎস
আপনি এখানে ঠিক না। বস্তু সংগ্রহ করা "শারীরিকভাবে" আবর্জনা নাও হতে পারে, তবে যুক্তিযুক্তভাবে এটি পরিচিত সময়ে কিছু গুরুত্বপূর্ণ মুক্ত করবে। এই "কিছু" কিছু অনির্ভরযোগ্য সম্পদ নয়, তবে কিছু সংখ্যক প্রোগ্রামের জন্য একটি থ্রেডপুল থ্রেড বরাদ্দকরণ, অন্য কোন প্রোগ্রাম ইত্যাদি ব্যবহারের লাইসেন্স - অর্থাৎ, লজিকাল সম্পদ। স্মৃতিতে বস্তুর উপস্থিতির একটি বিশদ বিশদ এবং নিষ্পত্তিযোগ্য বস্তু সঠিক পথে বাস্তবায়িত হলে অ্যাকাউন্টে নেওয়া উচিত নয়।
যোগ লেখক Vlad, উৎস
আচ্ছা, আমি আপনার পুরো প্রশ্নের জবাব দিচ্ছি না, এটি কেবল অংশ "কলিং এমন কোনও বস্তুর উপর নিষ্পত্তি করুন যা কোনও পরিচালিত সংস্থানগুলিতে আটকে থাকে না (...) অর্থহীন"। আমি কিছু উদাহরণ পেতে চেষ্টা করেছি যেখানে সম্পদটি মূলত পরিচালিত হয়, যদিও নির্ধারিত পদ্ধতিতে মুক্ত হওয়া দরকার। উদাহরণস্বরূপ, একটি সংগ্রহ সংশোধন করার অধিকার স্পষ্টভাবে কোনও পরিচালিত সংস্থান নয়, তবে এই অধিকারটি IDISposable সহ "nofollow noreferrer"> RAII-way একটি ভাল জিনিস: ব্যবহার করে (ObtainModifyRight (সংগ্রহ)) {/ * এটি সংশোধন করুন * /}
যোগ লেখক Vlad, উৎস
@ ম্যাসিজ - যতদূর "বিন্দুহীন" মন্তব্যটি চলে যায়, আপনি আমার উত্তরগুলি লিঙ্কযুক্ত অন্যান্য পোস্টগুলিতে আমার অন্যান্য ব্যাখ্যাগুলি পড়তে পারেন। যতদূর আপনার উত্তর "প্রমাণ" হিসাবে, ডকুমেন্টেশন এক জিনিস, তবে আপনি WinDbg এর সাথে OOM ব্যতিক্রম মেমরি ডাম্পগুলি ডিবাগ করেছেন এবং GC এর অভ্যন্তরীণ ক্রিয়াকলাপগুলিতে জ্ঞান না থাকলে, আপনাকে ডকুমেন্টেশনের চেয়ে আরও অভিজ্ঞতার উপর নির্ভর করতে হবে।
যোগ লেখক Dave Black, উৎস

তুমি ঠিক. পরিচালিত ডাটাবেস সংযোগ, ফাইল, রেজিস্ট্রি কী, সকেট ইত্যাদি সমস্ত অপ্রয়োজনীয় বস্তুগুলিতে ধরে রাখে। এজন্যই তারা IDisposable প্রয়োগ করে। যদি আপনার টাইপ ডিসপোজেবল বস্তুর মালিক হয় তবে আপনাকে আইডিসপোজেবল প্রয়োগ করতে হবে এবং আপনার নিষ্পত্তি পদ্ধতিতে তাদের নিষ্পত্তি করতে হবে। অন্যথায় তারা লককৃত ফাইল এবং অন্যান্য অপ্রত্যাশিত আচরণের ফলে সংগৃহীত আবর্জনা পর্যন্ত জীবিত থাকতে পারে।

3
যোগ
ইআর, মনে হচ্ছে আপনি OP এর সহকর্মীর সাথে একমত, OP সহ নয়।
যোগ লেখক BlueRaja - Danny Pflughoeft, উৎস
যে ক্ষেত্রে, পরিষ্কার করার জন্য unmanaged সম্পদ আছে। সহকর্মী যুক্তি দিচ্ছে যে যদি কোনও পরিচালিত সংস্থান না থাকে তবে IDisposable এর কোন প্রয়োজন নেই - OP মনে হয় যে "কোডটি আইডিসপোজেবল [কার্যকর করার মান রয়েছে]। ।] এমনকি পরিষ্কার করার জন্য কোনও পরিচালিত সম্পদ নেই। "
যোগ লেখক BlueRaja - Danny Pflughoeft, উৎস
@ ব্লুরাজ-ড্যানিফ্লুঘাউফ্ট: আমি মনে করি প্রশ্নটি কিছুটা অস্পষ্ট। আমার প্রশ্ন প্রধানত একটি প্রতিক্রিয়া তার উত্তরের প্রতি আমার উত্তর ছিল যে সবকিছুই শেষ পর্যন্ত একটি পরিচালিত সম্পদ। আমি সেই দাবিটি সমর্থন করছি।
যোগ লেখক Martin Liversage, উৎস
আচ্ছা, আমি অনুমান করি যে সহকর্মী যুক্তি দেখায় যে আপনার টাইপটি যদি পরিচালিত ADO সংযোগ থাকে তবে এটি IDisposable প্রয়োগ করতে হবে না কারণ সংস্থান পরিচালিত হয়। আমি যা বলি তা হল যে আপনার যে কোনও আইডিসপোজেবল বস্তুর ভিতরে গভীরভাবে থাকা উচিত কারণ এটি একটি পরিচালনা করা সম্পদ নয়। যখন আপনি আইডিসপোজেবল অবজেক্টগুলিকে সমষ্টিগত করেন তখন আপনাকে IDisposable প্রয়োগ করতে হবে।
যোগ লেখক Martin Liversage, উৎস

আমার প্রোজেক্টগুলির একটিতে আমার ভিতরে পরিচালিত থ্রেডগুলির একটি ক্লাস ছিল, আমরা তাদের থ্রেড এ, এবং থ্রেড বি, এবং একটি আইডিসপোজেবল বস্তু কল করব, আমরা এটি কল করব।

একটি exiting উপর সি নিষ্পত্তি নিষ্পত্তি। বি ব্যতিক্রম ব্যতিক্রম সংরক্ষণ সি ব্যবহার করা হয়।

আমার ক্লাসকে যথাযথ ক্রম অনুসারে নিষ্পত্তি করা হয়েছে তা নিশ্চিত করার জন্য আইডিস্পোজেবল এবং উত্তোলককে বাস্তবায়ন করতে হয়েছিল। হ্যাঁ জিসি আমার আইটেম পরিষ্কার করতে পারে, কিন্তু আমার অভিজ্ঞতা ছিল একটি জাতি শর্ত ছিল যদি না আমি আমার ক্লাস পরিষ্কার করা পরিচালিত।

1
যোগ

আপনার টাইপ IDIposable বাস্তবায়ন করা উচিত যদি এটি unmanaged সম্পদ উল্লেখ করে বা আইডিস্পোজেবল বাস্তবায়নের বস্তু রেফারেন্স থাকে।

1
যোগ

সংক্ষিপ্ত উত্তর: অবশ্যই না। আপনার টাইপের সদস্যরা যদি পরিচালনা বা পরিচালনা না করে থাকেন তবে আপনাকে IDISposable বাস্তবায়ন করতে হবে।

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

যতদূর আইডিসোপেজেবল বাস্তবায়নের সর্বোত্তম অনুশীলনগুলি, আমার ব্লগ পোস্টটি পড়ুন:

আপনি IDIposable সঠিকভাবে কিভাবে প্রয়োগ করবেন প্যাটার্ন?

1
যোগ

প্রয়োজনীয় সমস্ত সংস্থান (হয় পরিচালিত বা পরিচালিত নয়)। প্রায়শই, আইডিসপোজেবল combersome চেষ্টা করুন {..} পরিশেষে {..} বাদ দেওয়ার জন্য একটি সুবিধাজনক উপায় , তুলনা করুন:

  Cursor savedCursor = Cursor.Current;

  try {
    Cursor.Current = Cursors.WaitCursor;

    SomeLongOperation();
  }
  finally {
    Cursor.Current = savedCursor;
  }

সঙ্গে

  using (new WaitCursor()) {
    SomeLongOperation();
  }

যেখানে WaitCursor IDISposable ব্যবহার করে এর জন্য উপযুক্ত হতে হবে:

  public sealed class WaitCursor: IDisposable {
    private Cursor m_Saved;

    public Boolean Disposed {
      get;
      private set;
    }

    public WaitCursor() {
      Cursor m_Saved = Cursor.Current;
      Cursor.Current = Cursors.WaitCursor;
    }

    public void Dispose() {
      if (!Disposed) {
        Disposed = true;
        Cursor.Current = m_Saved;
      }
    }
  }

আপনি সহজেই এই শ্রেণীগুলি একত্রিত করতে পারেন :

  using (new WaitCursor()) {
    using (new RegisterServerLongOperation("My Long DB Operation")) {
      SomeLongRdbmsOperation();  
    }

    SomeLongOperation();
  }
0
যোগ

আইডিসপোজেবল প্রয়োগ করুন যদি বস্তুর কোনো পরিচালিত বস্তু বা কোন পরিচালিত ডিসপোজেবল বস্তু থাকে

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

0
যোগ