আমি কখন একজন ডেস্ট্রাক্টর তৈরি করব?


185

উদাহরণ স্বরূপ:

public class Person
{
    public Person()
    {
    }

    ~Person()
    {
    }
}

আমি কখন ম্যানুয়ালি একটি ডেস্ট্রাক্টর তৈরি করব? আপনার কখন ডেস্ট্রাক্টর তৈরি করার দরকার পড়েছে?


1
সি # ভাষা এগুলিকে "ডেস্ট্রাক্টর" বলে ডাকে, তবে বেশিরভাগ লোক তাদের "ফাইনালাইজার" হিসাবে ডাকে কারণ এটি তাদের .NET নাম এবং এটি সি ++ ডিস্ট্রাক্টরগুলির সাথে বিভ্রান্তি হ্রাস করে (যা বেশ আলাদা)। কীভাবে আইডিস্পোজেবল এবং ফাইনালাইজারগুলি কার্যকর করতে হয়: 3 সহজ বিধি
স্টিফেন ক্লিয়ারি

5
আপনি যখন বেপরোয়া বোধ করছেন।
ক্যাপড্রাগন

32
আমি মনে করি টমটমের কীবোর্ডটি ত্রুটিযুক্ত ছিল। ক্যাপস লকটি বিক্ষিপ্তভাবে চলছিল এবং বন্ধ ছিল। রহস্যময়।
জেফ লাফে


গ্রেগ বিচের পরামর্শের ভিত্তিতে ডিবাগিং এইড হিসাবে ডেস্ট্রাক্টর ব্যবহার করে শেষ করেছি: স্ট্যাকওভারফ্লো
ব্রায়ান

উত্তর:


237

আপডেট: 2015 সালের মে মাসে এই প্রশ্নটি আমার ব্লগের বিষয় ছিল । মহান প্রশ্নের জন্য ধন্যবাদ! লোকেরা সাধারণত চূড়ান্তকরণ সম্পর্কে বিশ্বাস করে এমন মিথ্যাচারের দীর্ঘ তালিকার জন্য ব্লগটি দেখুন।

আমি কখন ম্যানুয়ালি একটি ডেস্ট্রাক্টর তৈরি করব?

প্রায় না.

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

যদি আপনি কোনও ডেস্ট্রাক্টর তৈরি করেন তবে অত্যন্ত যত্নবান হন এবং জঞ্জাল সংগ্রহকারী কীভাবে কাজ করে তা বুঝতে পারেন । ধ্বংসকারীরা সত্যই অদ্ভুত :

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

প্রায়শই যা সাধারণত সাধারণত সত্য তা কোনও ডেস্ট্রাক্টরে সত্য। সত্যিই, সাবধান। একটি সঠিক ডেস্ট্রাক্টর লেখা খুব কঠিন।

আপনার কখন ডেস্ট্রাক্টর তৈরি করার দরকার পড়েছে?

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


"কনস্ট্রাক্টর শুরু হওয়ার পরে কিন্তু কনস্ট্রাক্টর শেষ হওয়ার আগে কোনও বস্তুকে ডিলস্ট্রাক্টর ডেকে আনা যেতে পারে" " তবে আমি রান করতে ফিল্ড ইনিশিয়ালাইজারের উপর নির্ভর করতে পারি, তাই না?
Configurator

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

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

1
পাইথননেট অনিয়ন্ত্রিত
সিপথনে জিআইএলকে

3
অসাধারণ নিবন্ধ এরিক। এর জন্য প্রপস -> "অতিরিক্ত বোনাস মজাদার: ডিবাগারে প্রোগ্রাম চলাকালীন রানটাইম কম আক্রমণাত্মক কোড জেনারেশন এবং কম আক্রমণাত্মক আবর্জনা সংগ্রহ ব্যবহার করে, কারণ আপনি ডিবাগ করছেন এমন অবজেক্টগুলি হঠাৎ করে অদৃশ্য হয়ে গেলেও এটি একটি খারাপ ডিবাগিং অভিজ্ঞতা the পরিবর্তনশীল অবজেক্টটির উল্লেখ করার সুযোগ রয়েছে scope এর অর্থ হ'ল যদি আপনার কোনও বাগ থাকে যেখানে খুব শীঘ্রই কোনও বস্তু চূড়ান্ত করা হচ্ছে, আপনি সম্ভবত ডিবাগারে সেই বাগটি পুনরুত্পাদন করতে পারবেন না! "
কেন পামার

17

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


25
@ থমাসডিং - হ্যাঁ এটি । C # এর বিনাশকারী সিনট্যাক্স ব্যবহার করে, কিন্তু এটি আসলে একটি তৈরি হচ্ছে finalizerআবার
জেডিবি এখনও মনিকার

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

8

আপনার ক্লাসটি উইন্ডোজ ফাইল হ্যান্ডলগুলির মতো পরিচালনা না করা রিসোর্সগুলি বজায় না রাখলে আপনার প্রয়োজন নেই।


5
ঠিক আছে, আসলে, এটি একটি ধ্বংসাত্মক বলা হয়
ডেভিড হেফারনান

2
আমি এখন দ্বিধান্বিত. এটি চূড়ান্তকারী বা ধ্বংসকারী?

4
সি # স্পেস আসলে এটিকে ডেস্ট্রাক্টর বলে। কেউ কেউ এটিকে ভুল হিসাবে দেখেন। stackoverflow.com/questions/1872700/…
আনি

2
@ থমাসডিং - হ্যাঁ এটি । C # এর বিনাশকারী সিনট্যাক্স ব্যবহার করে, কিন্তু এটি আসলে একটি তৈরি হচ্ছে finalizer
জেডিবি এখনও মনিকাকে

2
আমি এখানে মন্তব্যগুলি ভালবাসি, বাস্তব
পেন্টো

4

একে ডেস্ট্রাক্টর / ফাইনালাইজার বলা হয় এবং সাধারণত নিষ্পত্তিযোগ্য প্যাটার্নটি প্রয়োগ করার সময় তৈরি হয়।

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

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

একটি ভাল অনুশীলন হ'ল ক্লাসের ব্যবহারকারীকে অবিলম্বে সম্পদগুলি মুক্ত করার জন্য বস্তুটি নিষ্পত্তি করার সম্ভাবনা না দিয়ে চূড়ান্তকরণকারীকে বাস্তবায়ন না করা।


আসলে এটি যুক্তিসঙ্গত কারণেই সি # তে ডেস্ট্রাক্টর বলা হয় না।
টমটম

14
আসলে এটা । আমাকে ভুল করে দেওয়ার জন্য ধন্যবাদ এই নির্দিষ্ট সমস্যাটি সম্পর্কে এমএসডিএন গ্রন্থাগারটি দেখুন: এমএসডিএন.মাইক্রোসফট /en-us/library/66x5fx1b.aspx
অ্যাভিন্ড ব্রাথিন

1
@ টমটমের এটির অফিশিয়াল নাম ডেস্ট্রাক্টর
ডেভিড

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

3

যখন আপনার নিয়ন্ত্রণহীন সংস্থান আছে এবং আপনার অবজেক্ট চলে গেলে সেগুলি পরিষ্কার হয়ে যাবে তা নিশ্চিত করা দরকার। ভাল উদাহরণটি COM অবজেক্টস বা ফাইল হ্যান্ডলারগুলি হবে।


2

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


1

ডেস্ট্রাক্টররা আপনার ক্লাসে থাকা অপ্রয়োজনীয় রিসোর্সগুলি মুক্ত করার একটি অন্তর্নিহিত উপায় সরবরাহ করে, যখন জিসি এটির কাছাকাছি আসে এবং তারা স্পষ্টভাবে বেস শ্রেণির চূড়ান্তকরণ পদ্ধতিটি কল করে। যদি আপনি প্রচুর পরিমাণ নিয়ন্ত্রণহীন সংস্থান ব্যবহার করেন তবে এই সংস্থানগুলিকে আইডিসপোজেবল ইন্টারফেসের মাধ্যমে মুক্ত করার একটি সুস্পষ্ট উপায় সরবরাহ করা ভাল। সি # প্রোগ্রামিং গাইড দেখুন: http://msdn.microsoft.com/en-us/library/66x5fx1b.aspx

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