যেখানে 'নিষ্পত্তি' করার মতো কিছু নেই সেখানে 'ব্যবহার করা' কি উপযুক্ত?


9

সি # তে, usingবিবৃতিটি জঞ্জাল সংগ্রহকারীর জন্য অপেক্ষা না করে সংস্থানীয় পদ্ধতিতে সংস্থানগুলি নিষ্পত্তি করতে ব্যবহৃত হয়। উদাহরণস্বরূপ, এটি ব্যবহৃত হতে পারে:

  • এসকিউএল আদেশ বা সংযোগগুলি নিষ্পত্তি করুন

  • স্ট্রিমগুলি বন্ধ করুন, কোনও ফাইলের মতো অন্তর্নিহিত উত্সকে মুক্ত করে,

  • বিনামূল্যে জিডিআই + উপাদান,

  • প্রভৃতি

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

উদাহরণ:

  • স্ট্যাক ওভারফ্লো টিম দ্বারা লিখিত মিনিপ্রফিলারusing প্রোফাইলগুলিতে ব্লকগুলি বোঝাতে ব্যবহার করে:

    using (profiler.Step("Name goes here"))
    {
        this.DoSomethingUseful(i - 1);
    }
    

    একটি বিকল্প পদ্ধতির দুটি ব্লক থাকতে হবে:

    var p = profiler.Start("Name goes here");
    this.DoSomethingUseful(i - 1);
    profiler.Stop(p);
    

    আর একটি পদ্ধতির ক্রিয়া ব্যবহার করা হবে:

    profiler.Step("Name goes here", () => this.DoSomethingUseful(i - 1));
  • এএসপি.এনইটি এমভিসি usingফর্মগুলিও বেছে নিয়েছিল :

    <% using (Html.BeginForm())
       { %>
           <label for="firstName">Name:</label>
           <%= Html.TextBox("name")%>
           <input type="submit" value="Save" />    
    <% } %>
    

এই ধরনের ব্যবহার কি উপযুক্ত? এটির ন্যায্যতা কীভাবে দেওয়া যায়, সেখানে বিভিন্ন ত্রুটি রয়েছে:

  • নতুনদের হারিয়ে যেতে হবে, যেহেতু এই জাতীয় ব্যবহার বই এবং ভাষার স্পেসিফিকেশনে বর্ণিত একটির সাথে মিলে না,

  • কোডটি এক্সপ্রেশনভ হওয়া উচিত। এখানে, অভিব্যক্তিটি ভোগাচ্ছে, যেহেতু এর যথাযথ ব্যবহারটি usingদেখানোর জন্য যে পিছনে রয়েছে, সেখানে একটি সংস্থান, একটি নেটওয়ার্ক সংযোগ বা একটি ডাটাবেস রয়েছে যা আবর্জনা সংগ্রাহকের অপেক্ষা না করে প্রকাশ করা উচিত।


2
দুটি স্বতন্ত্র বক্তব্য থাকার পদ্ধতির ক্ষেত্রে নিখুঁত সংস্থান ব্যবস্থাপনার মতো একই সমস্যায় ভুগছে using: পরের বিবৃতি (উদাহরণস্বরূপ profiler.Stop(p)) ব্যতিক্রম এবং নিয়ন্ত্রণ প্রবাহের মুখে মৃত্যুদন্ড কার্যকর করা গ্যারান্টিযুক্ত নয়।

1
@ ডেলান: এটি ব্যাখ্যা করে কেন মিনিপ্রোফিলার দ্বিতীয় পদ্ধতিটি এড়িয়ে গেছেন। তবে দ্বিতীয়টি সব ক্ষেত্রে এড়ানো উচিত, যেহেতু এটি লেখার এবং রক্ষণাবেক্ষণ করা শক্ত।
আরসেনি মরজেনকো



উত্তর:


7

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

এই ইন্টারফেসের প্রাথমিক ব্যবহারটি নিয়ন্ত্রণহীন সংস্থানসমূহকে মুক্তি দেওয়া।

সুতরাং, যদি আপনার শ্রেণি যদি কোনও পরিচালনা না করে রাখা পুনরুদ্ধারগুলি ব্যবহার করে তবে আপনি কখন জিসি ঘটতে পারেন বা না চান তা বিবেচ্য নয় - পরিচালনা পাতানো সংস্থানগুলি জিসি'এড না হওয়ায় জিসির সাথে যা করার তা কিছুই পাওয়া যায় নি ( https: // স্ট্যাকওভারফ্লো) । com / প্রশ্নগুলি / 3607213 / কী-বলতে বোঝায়-দ্বারা পরিচালিত-বনাম-পরিচালনা-ব্যবস্থা-সংস্থান-নেট )।

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

সুতরাং ক্লাসটি যদি ব্যবহারের ব্লকে উদাহরণস্বরূপ ব্যবহার করা হয় যে কোনও পরিচালনা না করা সংস্থান ব্যবহার করে, তবে উত্তরটি হ্যাঁ - এটি উপযুক্ত।

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

যাই হোক না কেন, "ব্যবহার" এর ব্যবহার দ্বারা বোঝা যায় যে ক্লাসটি আইডেসपोসযোগ্য প্রয়োগ করে, সুতরাং এটি কোডের বহিঃপ্রকাশকে লঙ্ঘন করে না; বাস্তবে এটি কী ঘটছে তা একে একে পরিষ্কার করে দেয় makes


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

1
আমার দ্বিতীয় শেষ প্যারা নোট করুন - প্রাথমিক উদ্দেশ্য একমাত্র উদ্দেশ্য হতে হবে না । আইডিস্পোজেবল যেকোন কারণেই কার্যকর করা যেতে পারে এবং এটি প্রত্যাশিত আচরণ এবং ব্যবহারের শৈলীর সাথে একটি পরিচিত ইন্টারফেস সরবরাহ করে, তাই আপনি যখন দেখেন তখন বুঝতে পারেন যে ঘটনার আগে আরও কিছু হওয়ার দরকার যা কেবল সুযোগের বাইরে চলে যেতে দেওয়া যায় না। কথাটি হ'ল: যদি এটি আইডিস্পোজেবল কার্যকর করে, তবে ব্যবহার করা উপযুক্ত; অন্য সব কিছুই কেবল উপস্থাপনযোগ্য।
ম্যাক্সিমাস মিনিমাস

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

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

8

ব্যবহার usingএকটি Dispose()পদ্ধতির উপস্থিতি বোঝায় । অন্যান্য প্রোগ্রামাররা ধরে নেবে যে এই ধরণের একটি পদ্ধতি অবজেক্টে বিদ্যমান। ফলস্বরূপ, যদি কোনও জিনিস নিষ্পত্তিযোগ্য না usingহয় তবে আপনার এটি ব্যবহার করা উচিত নয় ।

কোড স্পষ্টতা রাজা। হয় বাদ দিন using, বা IDisposableবস্তুটি প্রয়োগ করুন।

MiniProfiler usingকোডটি প্রোফাইল করা হচ্ছে "বেড়াতে" একটি প্রক্রিয়া হিসাবে ব্যবহার করছে বলে মনে হয় । এর কিছুটা যোগ্যতাও রয়েছে; সম্ভবত, MiniProfiler হয় Dispose()টাইমার থামানোর জন্য কল করছে, বা MiniProfiler বস্তুটি সুযোগের বাইরে চলে গেলে টাইমারটি বন্ধ হয়ে যায়।

আরও সাধারণভাবে, আপনি usingযখন অনুরোধ করবেন যখন কোনও ধরণের চূড়ান্তকরণ স্বয়ংক্রিয়ভাবে ঘটে থাকে। এর জন্য নথির html.BeginFormবিবরণে বলা হয়েছে যে, পদ্ধতিটি যখন কোনও usingবিবৃতিতে ব্যবহৃত হয়, তখন </form>এটি usingব্লকের শেষে ক্লোজিং ট্যাগটি সরবরাহ করে ।

এর অর্থ এই নয় যে এটি এখনও অপব্যবহার নয়।


4
এতদূর সুস্পষ্ট। প্রশ্নটি হল, কখন (যদি আদৌ) ওপিতে বর্ণিত অর্থে নিষ্পত্তি করার মতো কিছু না থাকা সত্ত্বেও তা কার্যকর করা IDisposable/ যথাযথ হয় Dispose()?

2
আমি ভেবেছিলাম আমি তা পরিষ্কার করে দিয়েছি; সেখানে নয় একটি সময় যখন যে উপযুক্ত।
রবার্ট হার্ভে

1
আমার বক্তব্যটি হ'ল Disposeএটিকে usingবোঝার জন্য প্রয়োজনীয় (এটি উপযুক্ত কিনা তা নির্বিশেষে)। ওপির উদাহরণগুলি সমস্ত প্রয়োগ করে Dispose, তাই না? এবং আইআইইউসি, প্রশ্নটি হ'ল এই শ্রেণিগুলি Disposeঅন্য কোনও পদ্ধতির চেয়ে ( Stop()মিনিপ্রোফিলারের মতো ) ব্যবহার না করে সঠিক কিনা ।

1
হ্যাঁ, তবে এটি প্রশ্ন নয়। এটি করা ভাল ধারণা কিনা তা প্রশ্ন।

2
@ ডেলানন: আবারও, আমি ভেবেছিলাম আমি এটি পরিষ্কার করে দিয়েছি। এটি যদি আপনার কোডের উদ্দেশ্যকে আরও পরিষ্কার করে তোলে তবে এটি একটি ভাল ধারণা। যদি তা না হয়, তা নয়।
রবার্ট হার্ভে

1

usingত্রুটি এবং ব্যতিক্রম নিরাপদ। এটি নিশ্চিত করে Dispose()যে প্রোগ্রামার যে ভুল করে তা নির্বিঘ্নে ডাকা হবে। এটি ব্যতিক্রমগুলি ধরা বা পরিচালনা করতে হস্তক্ষেপ করে না, তবে Dispose()ব্যতিক্রম ছুঁড়ে ফেলা হলে পদ্ধতিটি পুনরাবৃত্তভাবে স্ট্যাকটিকে সম্পাদন করা হয়।

যে বস্তুগুলি বাস্তবায়ন করে IDisposeতবে সেগুলি করা হয়ে গেলে নিষ্পত্তি করার মতো কিছুই নেই। সর্বোত্তম, ভবিষ্যতে তাদের নকশা প্রমাণ করে। যাতে আপনাকে আপনার উত্স কোডটি রিফ্যাক্টর করতে না হয়, ভবিষ্যতে যখন তাদের তখন কোনও কিছু নিষ্পত্তি করার দরকার হয়।

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