সি # তে কোনও ক্লাসে ডেস্ট্রাক্টর এবং ফাইনালাইজ পদ্ধতির মধ্যে পার্থক্য কী?


98

কোনও ক্লাসে ডেস্ট্রাক্টর এবং ফাইনালাইজ পদ্ধতির মধ্যে যদি একটি থাকে তবে কী পার্থক্য?

আমি সম্প্রতি আবিষ্কার করেছি যে ভিজ্যুয়াল স্টুডিও ২০০ 2008 একটি চূড়ান্তকরণ পদ্ধতির সমার্থক একজন ডেস্ট্রাক্টরকে বিবেচনা করে, যার অর্থ ভিজুয়াল স্টুডিও আপনাকে একই সাথে কোনও ক্লাসে উভয় পদ্ধতি সংজ্ঞায়িত করতে দেয় না।

উদাহরণস্বরূপ, নিম্নলিখিত কোড খণ্ড:

class TestFinalize
{
    ~TestFinalize()
    {
        Finalize();
    }

    public bool Finalize()
    {
        return true;
    }
}

ডেস্ট্রাক্টরে চূড়ান্ত করতে কলটিতে নিম্নলিখিত ত্রুটিটি দেয়:

কলটি নিম্নলিখিত পদ্ধতি বা বৈশিষ্ট্যের মধ্যে দ্ব্যর্থক: 'টেস্টফাইনালাইজ। ~ টেস্টফাইনালাইজ ()' এবং 'টেস্টফাইনালাইজ.ফাইনালাইজ ()'

এবং যদি চূড়ান্তকরণের কলটিতে মন্তব্য করা হয় তবে এটি নিম্নলিখিত ত্রুটিটি দেয়:

টাইপ করুন 'ম্যানেজমেন্টকনসেপ্টস.সেসওয়ার্স.টেষ্টফাইনালাইজ' ইতিমধ্যে একই প্যারামিটার ধরণের সাথে 'ফাইনালাইজ' নামক একটি সদস্যকে সংজ্ঞায়িত করে

উত্তর:


68

সি # ওভাররাইড System.Object.Finalizeপদ্ধতিতে একজন ডেস্ট্রাক্টর । আপনি আছে বিনাশকারী সিনট্যাক্স ব্যবহার না করে। ম্যানুয়ালি ওভাররাইড করা Finalizeআপনাকে একটি ত্রুটি বার্তা দেবে।

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


71

উইকিপিডিয়া কোনো finalizer এবং একটি মধ্যে পার্থক্য কিছু ভাল আলোচনা হয়েছে বিনাশকারী মধ্যে finalizer নিবন্ধ।

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

~ClassName() { }

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

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

মাইক্রোসফ্টের সি ++ এর "ডেস্ট্রাক্টর" শব্দটি ব্যবহার বিভ্রান্তিমূলক, কারণ সি ++ এ এটি একই থ্রেডে কার্যকর করা হয় অবজেক্টটি মুছে ফেলা বা সজ্জিত করার সাথে সাথেই, যখন সি # তে এটি অন্য সময়ে পৃথক থ্রেডে কার্যকর করা হয়।


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

4
এছাড়াও নোট করুন ইসিএমএ -৩৩৪ স্পষ্টভাবে "ডেস্ট্রাক্টর" এবং "ফাইনালাইজার" কে আনুষ্ঠানিকভাবে বিতরণ করেছে long আমি জানি না কেন এমএস এখনও তাদের স্পেসিফিকেশনে বিভ্রান্তিকর শব্দটির জন্য জোর দিয়ে থাকে।
ফ্র্যাঙ্কএইচবি

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

20

এখানে পাওয়া গেছে: http://sanjaysainitech.blogspot.com/2007/06/differences-between-destructor-dispose.html

  1. ধ্বংসকারী

    এগুলি হল বিশেষ পদ্ধতি যা অবজেক্টের জন্য ক্লিন আপ কোড ধারণ করে। আপনি তাদের কোডগুলিতে স্পষ্টভাবে তাদের কল করতে পারবেন না কারণ এগুলিকে জিসি দ্বারা স্পষ্টভাবে ডাকা হয়। সি # তে তাদের ~সাইন চিহ্নের পূর্ববর্তী শ্রেণীর নামের মতোই নাম রয়েছে । পছন্দ-

    Class MyClass
    {
    
    ~MyClass()
    {
    .....
    }
    }
    

    ভিবি.এনইটি-তে, ডেস্ট্রাক্টরগুলি সিস্টেমের চূড়ান্তকরণ পদ্ধতিটি বাতিল করে প্রয়োগ করা হয় b

  2. নিষ্পত্তি

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

  3. চূড়ান্ত করা

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

    দ্রষ্টব্য: সি # তে, ফাইনালাইজ পদ্ধতিটি ওভাররাইড করা যাবে না, সুতরাং আপনাকে এমন ডেস্ট্রাক্টর ব্যবহার করতে হবে যার অভ্যন্তরীণ বাস্তবায়ন এমএসআইএল-এ ফাইনালাইজ পদ্ধতিটিকে ওভাররাইড করবে B

আপডেট: আকর্ষণীয় আধা সম্পর্কিত থ্রেড এখানে


4
You should only implement a Finalize method to clean up unmanaged resources: আপনি এটি ফাইনালাইজে রেখেছেন। নিষ্পত্তি একই?
hqt

@ এইচকিএইচটি: যেসব ক্ষেত্রে Disposeচূড়ান্তকরণকারী প্রয়োগ করা উচিত তাদের ক্ষেত্রে তুলনামূলকভাবে ছাড়িয়ে যাওয়া ক্ষেত্রে বাস্তবায়ন Disposeযদি এমন হয় যে সম্ভবত শ্রেণি বা উদ্ভূত শ্রেণীর কোনও উদাহরণ হ'ল সরাসরি পরিচালনা ব্যবস্থাবিহীন সংস্থার মালিকানা হ'ল, বা সরাসরি পরিচালনা না করা সংস্থার মালিকানাধীন সর্বশেষ জিনিসটির মালিক, অথবা সরাসরি নিজের মালিকানাধীন শেষ জিনিসটির মালিক ইত্যাদি। কেবলমাত্র Finalizeশ্রেণীর <i> সরাসরি </ i> যদি কোনও পরিচালনা ব্যবস্থা নেই <i> এবং প্রায় কিছুই না </ i> - একটি খুব সঙ্কীর্ণ দৃশ্যের মালিক যদি কেবলমাত্র সম্পদ পরিষ্কারের জন্য বাস্তবায়ন করুন ।
সুপারক্যাট

@ এইচকিএইচটি: যদি কোনও শ্রেণীর সরাসরি পরিচালনা করা সম্পদগুলির মালিকানা থাকে এবং অন্যান্য বস্তুর সাথেও রেফারেন্স থাকে তবে পরিচালনা না করা সংস্থানগুলি সাধারণত তাদের নিজস্ব চূড়ান্ত শ্রেণিতে বিভক্ত করা উচিত (যা আদর্শিকভাবে অন্য কোনও বিষয়ে দৃ to় রেফারেন্স রাখা উচিত নয়), অর্থ শ্রেণি যা অন্যান্য অবজেক্টের রেফারেন্স ধারণ করে কেবল সেই সংস্থাগুলির নিজস্ব সম্পত্তির মালিক না হয়ে কেবল "" নিয়ন্ত্রিত সংস্থাগুলির মালিকানাধীন "বিষয়গুলির মালিকানা অর্জন করবে এবং সুতরাং চূড়ান্তকরণকারীর প্রয়োজন হবে না।
সুপারক্যাট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.