প্রশ্ন: জাভা / সি # আরআইআই বাস্তবায়ন করতে পারে না কেন?
স্পষ্টকরণ: আমি সচেতন যে আবর্জনা সংগ্রহকারী নিরোধক নয়। সুতরাং বর্তমান ভাষার বৈশিষ্ট্যগুলির সাথে স্কোপের প্রস্থানটিতে কোনও সামগ্রীর ডিসপোজ () পদ্ধতিটি স্বয়ংক্রিয়ভাবে কল করা সম্ভব নয়। কিন্তু এই জাতীয় সংযোজনীয় বৈশিষ্ট্য যুক্ত করা যেতে পারে?
আমার বোঝার:
আমি অনুভব করি যে RAII এর বাস্তবায়ন অবশ্যই দুটি প্রয়োজনীয়তা পূরণ করবে:
১. কোনও উত্সের আজীবন অবশ্যই একটি সুযোগের সাথে আবদ্ধ থাকতে হবে।
2. অন্তর্নিহিত। সংস্থানটি মুক্ত হওয়া অবশ্যই প্রোগ্রামারের স্পষ্ট বিবৃতি ছাড়াই ঘটবে। স্পষ্ট বক্তব্য ছাড়াই মেমরি মুক্ত করা কোনও আবর্জনা সংগ্রাহকের সাথে সমতুল্য। "ফলস্বরূপ" কেবল শ্রেণীর ব্যবহারের সময়ে ঘটতে হবে। শ্রেণিকালীন গ্রন্থাগার স্রষ্টাকে অবশ্যই অবশ্যই ডেস্ট্রাক্টর বা নিষ্পত্তি () পদ্ধতি প্রয়োগ করতে হবে।
জাভা / সি # সন্তুষ্ট পয়েন্ট ১। সি # তে একটি সংস্থান প্রয়োগকারী আইডিস্পোজেবল একটি "ব্যবহার করে" সুযোগের সাথে আবদ্ধ হতে পারে:
void test()
{
using(Resource r = new Resource())
{
r.foo();
}//resource released on scope exit
}
এটি পয়েন্ট ২ টি পূরণ করে না The প্রোগ্রামারকে অবশ্যই স্পষ্টভাবে বস্তুকে একটি বিশেষ "ব্যবহার করে" সুযোগের সাথে আবদ্ধ করতে হবে। প্রোগ্রামাররা স্পষ্টভাবে একটি ফাঁকে ফাঁকে তৈরি করে, উত্সটিকে কোনও স্কোপের সাথে বেঁধে রাখতে (এবং করতে) ভুলে যেতে পারে।
প্রকৃতপক্ষে "ব্যবহার করে" ব্লকগুলি সংকলক কর্তৃক চেষ্টা-অবশেষে নিষ্পত্তি () কোডে রূপান্তরিত হয়। এটি চেষ্টা-অবশেষে নিষ্পত্তি () প্যাটার্নের একই স্পষ্ট প্রকৃতি রয়েছে। একটি নিখুঁত মুক্তি ছাড়া, একটি সুযোগ হুক সিনট্যাকটিক চিনি হয়।
void test()
{
//Programmer forgot (or was not aware of the need) to explicitly
//bind Resource to a scope.
Resource r = new Resource();
r.foo();
}//resource leaked!!!
আমি মনে করি জাভা / সি # তে একটি ভাষা বৈশিষ্ট্য তৈরি করা উপযুক্ত special বিশেষ স্মৃতিগুলিকে স্মার্ট পয়েন্টারটির মাধ্যমে স্ট্যাকের কাছে ঝুঁকতে দেওয়া মঞ্জুরি দেয়। বৈশিষ্ট্যটি আপনাকে স্কোপ-বাউন্ড হিসাবে কোনও শ্রেণি পতাকাঙ্কিত করতে দেয়, যাতে এটি সর্বদা স্ট্যাকের একটি হুক দিয়ে তৈরি হয়। বিভিন্ন ধরণের স্মার্ট পয়েন্টারগুলির জন্য বিকল্প থাকতে পারে।
class Resource - ScopeBound
{
/* class details */
void Dispose()
{
//free resource
}
}
void test()
{
//class Resource was flagged as ScopeBound so the tie to the stack is implicit.
Resource r = new Resource(); //r is a smart-pointer
r.foo();
}//resource released on scope exit.
আমি মনে করি অনর্থক "এটি মূল্যবান"। ঠিক যেমন জঞ্জাল সংগ্রহের ফলস্বরূপ "এটি মূল্যবান"। সুস্পষ্ট ব্যবহারের মাধ্যমে ব্লকগুলি চোখকে সতেজ করে তুলছে, তবে শেষ পর্যন্ত-নিষ্পত্তি করে চেষ্টা করুন () এর চেয়ে কোনও লাভজনক প্রস্তাব রাখবেন না।
জাভা / সি # ভাষায় এই জাতীয় বৈশিষ্ট্যটি প্রয়োগ করা কি অবাস্তব? এটি পুরানো কোডটি না ভেঙে চালু করা যেতে পারে?
using
করুন কার্যকর করার Dispose
জন্য গ্যারান্টিযুক্ত (ভাল, একটি ব্যতিক্রম ছোঁড়া ছাড়াই আকস্মিকভাবে মারা যাওয়ার প্রক্রিয়াটি ছাড় দেওয়া, যার পরে সমস্ত ক্লিনআপ সম্ভবত মোটা হয়ে যায়)।
struct
Dispose
গুলি সর্বদা চালিত হওয়ার গ্যারান্টি দেয় না , তারা কীভাবে ট্রিগার হয় তা নির্বিশেষে। সুযোগের শেষে অন্তর্নিহিত ধ্বংস যোগ করা এতে সহায়তা করবে না।