সি # তে কোনও ক্রিয়াকলাপের নামের আগে টিলডের অর্থ কী?


164

আমি কিছু কোড দেখছি এবং এটিতে এই বক্তব্য রয়েছে:

~ConnectionManager()
{
    Dispose(false);
}

ক্লাসটি IDisposableইন্টারফেস প্রয়োগ করে , তবে আমি জানি না যে এটি টিল্ড (~) এর জন্য ব্যবহৃত হয় part

উত্তর:


213

the সর্বনাশকারী

  1. ধ্বংসকারীদের স্বয়ংক্রিয়ভাবে আহ্বান করা হয় এবং এগুলি স্পষ্টতই আহবান করা যায় না।
  2. ধ্বংসকারীদের ওভারলোড করা যায় না। সুতরাং, একটি শ্রেণীর সর্বাধিক, একজন ডেস্ট্রাক্টর থাকতে পারে।
  3. ধ্বংসকারীদের উত্তরাধিকার সূত্রে প্রাপ্ত হয় না। সুতরাং, একটি শ্রেণীর এক ছাড়া অন্য কোনও ডেস্ট্রাস্টার নেই, যা এটিতে ঘোষণা করা যেতে পারে।
  4. স্ট্রাক্ট সহ ডেস্ট্রাক্টর ব্যবহার করা যায় না। এগুলি কেবল ক্লাস সহ ব্যবহৃত হয়। কোনও কোড দৃষ্টান্তটি ব্যবহার করা আর সম্ভব না হলে একটি উদাহরণ ধ্বংসের জন্য যোগ্য হয়ে ওঠে possible
  5. উদাহরণটি ধ্বংসের জন্য যোগ্য হওয়ার পরে উদাহরণস্বরূপ ধ্বংসকারীকে কার্যকর করা যে কোনও সময় ঘটতে পারে।
  6. যখন কোনও উদাহরণ ধ্বংস করা হয়, তার উত্তরাধিকার শৃঙ্খলে ধ্বংসকারীদের ডেকে আনা হয়, যাতে বেশিরভাগ উত্পন্ন থেকে কম প্রাপ্ত হয়।

পাকা করা

সি # তে, ফাইনালাইজ পদ্ধতিটি স্ট্যান্ডার্ড সি ++ ডিস্ট্রাক্টর যে কাজগুলি করে তা সম্পাদন করে। সি # তে আপনি এটি চূড়ান্তকরণের নাম রাখেন না - আপনি শ্রেণীর নামের আগে টিলড (~) চিহ্ন স্থাপনের সি ++ ডিস্ট্রাক্টর সিনট্যাক্স ব্যবহার করেন।

মীমাংসা করা

একটি Close()বা। তে বস্তুর নিষ্পত্তি করা ভালDispose()শ্রেণীর ব্যবহারকারীর দ্বারা স্পষ্ট করে বলা যেতে পারে এমন পদ্ধতিতে । ফাইনালাইজ (ডিসস্ট্রাক্টর) কে জিসি ডেকে আনে।

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

কী ব্যবহার করবেন?

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


3
আমি জানি না অতীতে এটি কীভাবে ব্যবহৃত হত। কিন্তু এখন ধ্বংসকারীরা উত্তরাধিকার সূত্রে প্রাপ্ত। : আরও তথ্য (শেষে উদাহরণ চেক করুন) জন্য এই লিঙ্কে চেক করুন msdn.microsoft.com/en-us/library/66x5fx1b.aspx
RononDex

1
আপনি যে পৃষ্ঠাটির সাথে লিঙ্ক করেছেন সেই পৃষ্ঠাটির @ রোননডেক্স পয়েন্ট 3 "ফাইনালাইজারদের উত্তরাধিকার সূত্রে প্রাপ্ত হতে পারে না" , যা আপনার মন্তব্যের বিরোধিতা করে। এটা তোলে বোঝা যাচ্ছে যে নেতারা সব একটু বিভ্রান্তিকর কারণ যখন তারা উত্তরাধিকারসূত্রে করা যাবে না, " Finalizeপদ্ধতি যাও recursively উত্তরাধিকার চেন সমস্ত উদাহরণ জন্য বলা হয়, থেকে অন্তত ডিরাইভড সবচেয়ে ডিরাইভড" । লক্ষ্য করুন যে না একই আচরণ আপনি, যদিও উত্তরাধিকারসূত্রে destructors থেকে পেতে চাই।
মার্ক আমেরিকা

@ মার্কআমেরি আহ আমি দেখছি, তাই মূলত উত্তরাধিকারসূত্রে প্রাপ্ত কোনও কিছুর তুলনায় তারা বিপরীত ক্রমে ডাকা হয়?
রোননডেক্স

45

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

  • আপনার নিয়ন্ত্রণহীন রিসোর্সে সরাসরি অ্যাক্সেস রয়েছে (যেমন একটি মাধ্যমে IntPtr) এবং আপনি ব্যবহার করতে পারবেন নাSafeHandle এটি যা এটি আরও সহজ করে
  • আপনি এমন IDisposableএকটি ক্লাসে প্রয়োগ করছেন যা সিল করা হয়নি। (আমার অগ্রাধিকার হ'ল ক্লাসগুলি উত্তরাধিকারের জন্য নকশাকৃত না করে সিল করা)) এই জাতীয় ক্ষেত্রে চূড়ান্তরক্ষক হ'ল ক্যানোনিকাল ডিসপোজ প্যাটার্নের অংশ।

9

এটি শ্রেণীর জন্য ডেস্ট্রাক্টর নির্দেশ করতে ব্যবহৃত হয়।


12
আপনি যে সি # স্পেসটি পড়েছেন তার উপর নির্ভর করে এগুলি উভয়ই সঠিক। অতি সাম্প্রতিক এমএস এক (ইউনিফাইড সি # 3.0) তাদেরকে ডেস্ট্রাক্টর হিসাবে উল্লেখ করে (যেমন বিভাগ 10.13) তবে ইসিএমএ স্পেক তাদের চূড়ান্ত হিসাবে উল্লেখ করে as
জন স্কিটি

@ 1800INFORMATION: সিনট্যাকটিক উপাদানটিকে যথাযথভাবে ডেস্ট্রাক্টর বলা হয়। যদি কোনও শ্রেণীর একটি ডেস্ট্রাক্টর থাকে, একটি সি # সংকলক একটি চূড়ান্তকরণকারী স্বয়ংক্রিয়ভাবে উত্পন্ন করে যার মধ্যে একটি সাধারণ-অব্যর্থ try/finallyব্লক অন্তর্ভুক্ত থাকে যা নিশ্চিত করে যে পিতামাত Finalizeপদ্ধতিটি কল হয়। বেশিরভাগ জিনিস যা ধ্বংসকারীদের পক্ষে সত্য তা ফাইনালাইজারদের ক্ষেত্রে সত্য এবং বিপরীত হয় তবে শব্দগুলির অর্থ কিছুটা আলাদা জিনিস mean
সুপারক্যাট


3

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


1

। সাধারণত একটি ডিকনস্ট্রাক্টর প্রতিনিধিত্ব করে। যা কোনও বস্তুর মৃত্যুর আগে চালানো হয়।

আমি পেয়েছি সি # ডিকনস্ট্রাক্টরের একটি বিবরণ এখানে


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