.NET- এ ব্যবহারের পরে অব্যবস্থাগুলি নাল / কিছুইতে সেট করা


187

একবারে সমস্ত জিনিস শেষ হয়ে গেলে null( Nothingভিবি.এনইটি তে) সেট করা উচিত ?

আমি বুঝতে পারি যে .NET- IDisposableতে কিছু সংস্থান প্রকাশের জন্য ইন্টারফেস প্রয়োগকারী কোনও বস্তুর নিষ্পত্তি করা অপরিহার্য, যদিও বস্তুটি এটি নিষ্পত্তি হওয়ার পরেও কিছু হতে পারে (সুতরাং isDisposedসম্পত্তি হিসাবে), তাই আমি ধরে নিয়েছি এটি এখনও স্থায়ী হতে পারে স্মৃতিশক্তি বা কমপক্ষে?

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

সুতরাং nullএটি মনে রেখে এটি সেটাকে মেমরির প্রকাশের গতি বাড়ানোর জন্য সেট করবে কারণ এটি কাজ করার দরকার নেই যে এটি আর সুযোগের মধ্যে নেই এবং এগুলির কোনও খারাপ পার্শ্ব প্রতিক্রিয়া কি?

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


4
+1 দুর্দান্ত প্রশ্ন। কেউ কি এমন পরিস্থিতি জানেন যার অধীনে সংকলক কার্যভার সম্পূর্ণরূপে অপ্টিমাইজ করবে? অর্থাত্ যে কেউ এমএসআইএলকে বিভিন্ন পরিস্থিতিতে দেখেছেন এবং কোনও জিনিস শূন্য করতে (বা এর অভাব) সেট করার জন্য আইএল উল্লেখ করেছেন।
টিম মেডোরা

উত্তর:


73

কার্ল একেবারে সঠিক, ব্যবহারের পরে শূন্য করতে কোনও জিনিস সেট করার দরকার নেই। যদি কোনও বস্তু প্রয়োগ করে IDisposable, কেবলমাত্র নিশ্চিত হয়ে নিন যে আপনি IDisposable.Dispose()যখন সেই অবজেক্টটি (একটি try.. finally, বা একটি using()ব্লকে আবৃত) দিয়ে শেষ করেছেন তখনই আপনি কল করেছেন । আপনি কল করতে মনে না Dispose()রাখলেও, অবজেক্টের চূড়ান্ত পদ্ধতিটি আপনাকে কল করা উচিত Dispose()

আমি ভেবেছিলাম এটি একটি ভাল চিকিত্সা:

আইডিস্পোজেবলের মধ্যে খনন

এবং এই

অপ্রয়োজনীয় বোঝা

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


6
নালায় সেট না করার নিয়মটি "কঠোর এবং দ্রুত" নয় ... যদি বস্তুটি বৃহত অবজেক্টের গাদা (আকার> 85 কে) এ স্থাপন করা হয় তবে আপনি কাজটি শেষ করার পরে যদি অবজেক্টটি নালায় সেট করেন তবে এটি জিসিকে সহায়তা করবে এটি ব্যবহার করছি.
স্কট ডরম্যান

আমি সীমিত পরিমাণে একমত, তবে যদি না আপনি মেমরির চাপ অনুভব করতে শুরু করেন তবে আমি ব্যবহারের পরে অবজেক্টগুলি স্থির করে 'অকালপূর্বক অনুকূলিতকরণের' প্রয়োজন দেখছি না।
কেভ

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

19
এর সত্যিকারের অর্থ হ'ল "আবর্জনা সংগ্রাহক আপনার চেয়ে স্মৃতি পরিচালনা করার ক্ষেত্রে আরও ভাল।" যদিও এটি কেবল আমার হতে পারে। :)
ববরোডস

2
@ ববিশ্যাফটয়ে: "অসময়ে অপটিমাইজেশন খারাপ, সর্বদা" বলা সম্ভবত "তত ধীরে ধীরে পছন্দ করা" এর মত বিপরীত চরমের দিকে ঝাঁপিয়ে পড়া বলা সম্ভবত ভুল wrong কোন যুক্তিসঙ্গত প্রোগ্রামার বলবে না। এটি আপনার অনুকূলকরণ সম্পর্কে কী উপকার এবং স্মার্ট সম্পর্কে। আমি কোডের স্বচ্ছতা এবং সত্যই টেস্টের পারফরম্যান্স সম্পর্কে ব্যক্তিগতভাবে চিন্তিত ছিলাম যেহেতু আমি ব্যক্তিগতভাবে প্রচুর লোককে দেখেছি (নিজেকে যখন আমি ছোট ছিলাম তখনও) "নিখুঁত" অ্যালগরিদম তৈরি করতে খুব বেশি সময় ব্যয় করেছি, কেবল এটি 0.1 মিমি সঞ্চয় করতে পারে 100,000 পুনরাবৃত্তিতে সমস্ত সময় পাঠযোগ্যতা সম্পূর্ণরূপে শট করা হয়েছিল।
ব্রেন্ট রাইটেনহাউস

36

আপনার সাথে কাজ শেষ হয়ে গেলে বস্তুগুলি স্থির করে দেওয়া এড়ানোর আর একটি কারণ হ'ল এটি তাদের আরও দীর্ঘকাল ধরে বাঁচিয়ে রাখতে পারে।

যেমন

void foo()
{
    var someType = new SomeType();
    someType.DoSomething();
    // someType is now eligible for garbage collection         

    // ... rest of method not using 'someType' ...
}

"ডোসোমিংথিং" এর কল করার পরে কিছু টাইপ দ্বারা রেফারেন্স করা বস্তুকে GC'd করার অনুমতি দেবে কিন্তু

void foo()
{
    var someType = new SomeType();
    someType.DoSomething();
    // someType is NOT eligible for garbage collection yet
    // because that variable is used at the end of the method         

    // ... rest of method not using 'someType' ...
    someType = null;
}

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


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

1
তারা বেঁচে থাকার বিষয়টি নিশ্চিত করার জন্য পছন্দের উপায়টিGC.KeepAlive(someType);
হ'ল ericlippert.com/2013/06/10/Conferences-

14

কোন জিনিস বাতিল করবেন না। আপনি আরও তথ্যের জন্য http://codebetter.com/blogs/karlseguin/archive/2008/04/27/foundations-of-programming-pt-7-back-to-basics-memory.aspx পরীক্ষা করতে পারেন , তবে জিনিসগুলি সেট করতে পারেন আপনার কোডটি নোংরা করা ব্যতীত, কোনও কিছুই করবে না


1
ভাগ করা লিঙ্কটিতে মেমরি সম্পর্কে দুর্দান্ত এবং বিস্তারিত ব্যাখ্যা
ব্যবহারকারী 2323308

লিঙ্ক ভাঙা। লিঙ্কযুক্ত সামগ্রী ব্যতীত, এই উত্তরটি বরং ব্যবহারযোগ্য এবং মুছে ফেলা উচিত।
ইম্রে পহভেল


7

সাধারণভাবে, ব্যবহারের পরে অবজেক্টগুলি বাতিল করার দরকার নেই, তবে কিছু ক্ষেত্রে আমি এটি একটি ভাল অনুশীলন বলে মনে করি।

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

this.myField.Dispose();
// ... at some later time
this.myField.DoSomething();

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


8
ঠিক আছে, যদি কোনও ইতিমধ্যে নিষ্পত্তি হয়ে যায় তবে কোনও নিষ্পত্তিযোগ্য অবজেক্টের অবজেক্টডিস্পোজড এক্সেপশন নিক্ষেপ করা উচিত। এটি, যতদূর আমি জানি, পুরো জায়গাতেই বয়লারপ্লেট কোডের প্রয়োজন হয়, তবে তারপরেও, নিষ্পত্তি হ'ল যাইহোক, একটি খারাপ চিন্তা-ভাবনা দৃষ্টান্ত।
নিকোডেমাস 13

3
Ctrl + F এর জন্য .Dispose()। যদি এটি খুঁজে পান তবে আপনি আইডিসপোজেবলটি সঠিকভাবে ব্যবহার করছেন না। ডিসপোজেবল অবজেক্টের একমাত্র ব্যবহার হ'ল ব্যবহার-ব্লকের সীমানায় থাকতে হবে। এবং ব্যবহার-ব্লকের পরে, আপনার myFieldআর অ্যাক্সেস নেই। এবং ইউজিং ব্লকের মধ্যে, সেটিংসের nullপ্রয়োজন নেই, ব্যবহার-ব্লকটি আপনার জন্য অবজেক্টটি নিষ্পত্তি করবে।
সুমেরে

7

সম্ভাবনাগুলি হ'ল যদি আপনি nullভেরিয়েবলগুলির প্রয়োজনীয়তা অনুভব করেন তবে আপনার কোডটি যথেষ্ট পরিমাণে কাঠামোযুক্ত নয় ।

ভেরিয়েবলের পরিধি সীমাবদ্ধ করার জন্য বিভিন্ন উপায় রয়েছে:

স্টিভ ট্রানবি দ্বারা উল্লিখিত

using(SomeObject object = new SomeObject()) 
{
  // do stuff with the object
}
// the object will be disposed of

একইভাবে, আপনি কেবল কোঁকড়ানো বন্ধনী ব্যবহার করতে পারেন:

{
    // Declare the variable and use it
    SomeObject object = new SomeObject()
}
// The variable is no longer available

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


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

অন্য নোটে: কারণ সি # সংকলক স্থানীয়-স্কোপযুক্ত ভেরিয়েবলগুলি সনাক্ত করবে যা আইডিস্পোজেবল বাস্তবায়ন করে এবং কল করবে their যখন তাদের সুযোগ শেষ হয়ে যায় তখন ডিসপোজ (সময়ের বেশিরভাগ)। তবে ... এসকিউএল সংযোগগুলি একটি বড় সময় যখন .Dispose () কখনই অনুকূলিত হয় না। কিছু ধরণের রয়েছে যার জন্য সুস্পষ্ট মনোযোগ প্রয়োজন, তাই আমি ব্যক্তিগতভাবে সর্বদা জিনিসগুলি স্পষ্টভাবেই করি তাই যাতে আমার কামড় না পড়ে।
সুমেরে

5

আপনার যখন কেবল চলকটি নালায় সেট করা উচিত তখনই যখন ভেরিয়েবলটি সুযোগের বাইরে চলে না যায় এবং এর সাথে সম্পর্কিত ডেটার দরকার নেই। না হলে দরকার নেই।


2
এটি সত্য, তবে এর অর্থ এটিও সম্ভবত আপনার কোডটি রিফেক্টর করা উচিত। আমি মনে করি না এর উদ্দেশ্যযুক্ত ক্ষেত্রের বাইরে আমার কোনও ভেরিয়েবল ঘোষণা করার দরকার পড়েছিল।
কার্ল সেগুইন

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

5

সাধারণভাবে নালার জন্য সেট করার দরকার নেই। তবে ধরুন আপনার ক্লাসে রিসেট কার্যকারিতা রয়েছে।

তারপরে আপনি এটি করতে পারেন, কারণ আপনি ডিসপোজকে দু'বার কল করতে চান না, কারণ কিছু ডিসপোজ সঠিকভাবে প্রয়োগ করা যেতে পারে না এবং সিস্টেম নিক্ষেপ করতে পারেন bঅজেক্টডিসপজড ব্যতিক্রম।

private void Reset()
{
    if(_dataset != null)
    {
       _dataset.Dispose();
       _dataset = null;
    }
    //..More such member variables like oracle connection etc. _oraConnection
 }

একটি পৃথক পতাকা দিয়ে সম্ভবত এটি ট্র্যাক করা সেরা।
থুলানি চিভান্দিকওয়া

3

এই ধরণের "ব্যবহারের পরে অব্যবস্থা স্থির করার দরকার নেই" সম্পূর্ণ নির্ভুল নয়। পরিবর্তনগুলি নিষ্পত্তি করার পরে আপনাকে নাল করার প্রয়োজন হয়।

হ্যাঁ, আপনার কাজ শেষ হওয়ার পরে আপনার সর্বদা কল করা উচিত .Dispose()বা .Close()যে কোনও কিছুতে এটি করা উচিত। এটি হ্যান্ডলগুলি, ডাটাবেস সংযোগগুলি বা নিষ্পত্তিযোগ্য বস্তুর ফাইল করুন file

এটি থেকে পৃথক করা লাজিলোডের খুব ব্যবহারিক প্যাটার্ন।

আমি আছে এবং instantiated বলুন ObjAএর class AClass Aএকটি পাবলিক সম্পত্তি বলা PropBহয়class B

অভ্যন্তরীণভাবে, বাতিল PropBকরার জন্য ব্যক্তিগত ভেরিয়েবল _Bএবং ডিফল্ট ব্যবহার করে । যখন PropB.Get()ব্যবহার করা হয়, এটা চেক কিনা তা দেখতে _PropBহয় নাল এবং যদি তা না হয়, সম্পদ instantiate করা প্রয়োজন প্রর্দশিত Bমধ্যে _PropB। এটি তারপরে ফিরে আসে _PropB

আমার অভিজ্ঞতার কাছে এটি সত্যই কার্যকর কৌশল।

যেখানে শূন্য করার প্রয়োজনটি এখানে আসে যদি আপনি এটিকে পুনরায় সেট করতে বা কিছু পরিবর্তন করে থাকেন যে বিষয়বস্তুগুলির _PropBপূর্ববর্তী মানগুলির সন্তান ছিল A, আপনাকে নিষ্পত্তি করতে হবে এবং বাতিল করতে হবে _PropBযাতে কোডটি লাজিএলড সঠিক মান আনতে পুনরায় সেট করতে পারে এটি প্রয়োজন

আপনি যদি কেবলমাত্র এটি করেন _PropB.Dispose()এবং অল্পক্ষণের মধ্যেই লাজিএলএডের নাল চেকটি সফল হওয়ার প্রত্যাশা করেন, এটি নাল হবে না এবং আপনি বাসি ডেটার দিকে তাকাবেন। বাস্তবে, আপনাকে অবশ্যই Dispose()নিশ্চিত হওয়ার পরে এটি বাতিল করতে হবে।

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

অবশেষে, নিষ্পত্তিযোগ্য সম্পত্তি বাতিল হয়ে যাবে, তবে এটি আমার দৃষ্টিকোণ থেকে অ-সংজ্ঞাবহ হয়েছে।

মূল কারণ হিসাবে, ডিবিকেকে ইলিউডস হ'ল প্যারেন্ট পাত্রে ( ObjAসহ PropB) দৃষ্টান্তটি _PropBস্কোপে রাখছে , যদিও সত্ত্বেও Dispose()


ম্যানুয়ালি বাতিল করতে কীভাবে সেট করা তা দেখানো ভাল উদাহরণের অর্থ কলারের পক্ষে আরও মারাত্মক ত্রুটি যা ভাল জিনিস।
রোলগুলি

1

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

তবে এই ধরণের জিনিসটি কেবল দীর্ঘকালীন সংগ্রহে গুরুত্বপূর্ণ। যদি কাতারে এটি তৈরি করা ফাংশনটির শেষে বেঁচে না চলে, তবে এটি পুরোপুরি কম matters

মোট কথা, আপনার সত্যিই মাথা ঘামানো উচিত নয়। সংকলক এবং জিসিকে তাদের কাজগুলি করতে দিন যাতে আপনি নিজের কাজটি করতে পারেন।


1

এই নিবন্ধটিও একবার দেখুন: http://www.codeproject.com/KB/cs/idisposable.aspx

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


1

স্টিফেন ক্লিয়ারি এই পোস্টে খুব ভাল ব্যাখ্যা করেছেন: আমার কী আবশ্যিকভাবে সেট করতে হবে নাল থেকে আবর্জনা সংগ্রহে সহায়তা?

বলেছেন:

অধৈর্য হ্যাঁর জন্য সংক্ষিপ্ত উত্তর, চলকটি যদি স্থির ক্ষেত্র হয়, বা আপনি একটি অসংখ্য পদ্ধতি (ফলন প্রত্যাবর্তন ব্যবহার করে) বা একটি অ্যাসিঙ্ক্রোনাস পদ্ধতি (অ্যাসিঙ্ক ব্যবহার করে অপেক্ষা করছেন) লিখছেন। অন্যথায়, না।

এর অর্থ হ'ল নিয়মিত পদ্ধতিতে (অগণিত এবং অ-অ্যাসিঙ্ক্রোনাস) আপনি স্থানীয় ভেরিয়েবল, পদ্ধতি পরামিতি বা উদাহরণ ক্ষেত্রগুলি বাতিল করে না।

(এমনকি যদি আপনি আইডিস্পোজেবল বাস্তবায়ন করেন is বিতর্ক করুন, আপনার এখনও ভেরিয়েবলগুলি বাতিল করে দেওয়া উচিত নয়)।

আমাদের যে গুরুত্বপূর্ণ বিষয়টি বিবেচনা করা উচিত তা হ'ল স্ট্যাটিক ফিল্ডস

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

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

উপসংহার:

স্থির ক্ষেত্র ; এটা সম্বন্ধে. আর কিছু হ'ল সময় নষ্ট


0

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

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

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

আমি যদি বুঝতে পারি যে এটি পরবর্তী দরিদ্র বোকা যারা আমার পদক্ষেপে অনুসরণ করে আমার উদ্দেশ্য পরিষ্কার করে তোলে এবং যদি এটি কখনও কখনও জিসিকে " সম্ভাব্য " সাহায্য করে তবে এটি আমার পক্ষে মূল্যবান। বেশিরভাগ ক্ষেত্রে এটি আমাকে পরিপাটি এবং পরিষ্কার বোধ করে এবং মঙ্গো পরিপাটি এবং পরিষ্কার বোধ করতে পছন্দ করে। :)

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

আমি বুঝতে পারি "অপ্রয়োজনীয় জিনিস" (ফাঁকা রেখার মতো) "মানসিকতা শোরগোল এবং বিশৃঙ্খলা কোড ছাড়া কিছুই নয়।" আমার কর্মজীবনের প্রথমদিকে এটিই ছিল; আমি পুরোপুরি এটি পেতে। এই মুহুর্তে আমি তার দিকে ঝুঁকছি যা কোডকে আরও পরিষ্কার করে। এটি আমার প্রোগ্রামগুলিতে "শব্দ" এর 50 টি লাইন যুক্ত করার মতো নয় - এটি এখানে বা সেখানে কয়েকটি লাইন।

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

দিন শেষে নিশ্চিত হয়ে নিন যে আপনি কী বুঝতে পেরেছেন জিসির জন্য উপযুক্ত এবং কী নয়; লক করুন, নিষ্পত্তি করুন এবং যথাযথভাবে বাতিল করুন; মোম চালু, মোম বন্ধ; শ্বাস ফেলা, শ্বাস ফেলা; এবং অন্য সব কিছুর জন্য আমি বলি: যদি ভাল লাগে তবে তা করুন। আপনার মাইলেজটি পৃথক হতে পারে ... যেমনটি হওয়া উচিত ...


0

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

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


-1

কিছু অবজেক্ট মনে করে সেই .dispose()পদ্ধতিটি যা উত্সটিকে মেমরি থেকে অপসারণ করতে বাধ্য করে।


11
না এটা হয় না; নিষ্পত্তি () অবজেক্টটি সংগ্রহ করে না - এটি নিয়ন্ত্রক পরিষ্কার করার জন্য ব্যবহৃত হয়, সাধারণত পরিচালনা না করা রিসোর্সগুলি প্রকাশ করে।
মার্ক গ্র্যাভেল

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