টিএলডিআর: এটি দীর্ঘস্থায়ী পরিচিত বাগ। আমি এটি সম্পর্কে প্রথম লিখেছিলাম ২০১০ সালে:
https://blogs.msdn.microsoft.com/ericlippert/2010/01/18/a-definite-assignment-anomaly/
এটি নিরীহ এবং আপনি এটি নিরাপদে উপেক্ষা করতে পারেন এবং কিছুটা অস্পষ্ট বাগ খুঁজে পাওয়ার জন্য নিজেকে অভিনন্দন জানাতে পারেন।
সংকলকটি Emailঅবশ্যই কার্যকর করা উচিত না কেন ?
ওহ, এটি একটি ফ্যাশন করে। এটির শর্তটি কীভাবে বোঝায় যে ভেরিয়েবলটি অবশ্যই নির্ধারিত হয়েছে সে সম্পর্কে এটির একটি ভুল ধারণা রয়েছে, যা আমরা দেখব।
এই কোডটি যদি পৃথক সমাবেশে স্ট্রাক্ট তৈরি করা হয় তবে এটি সংকলন করে না তবে বিদ্যমান সংঘে স্ট্রাকটি সংজ্ঞায়িত করা থাকলে তা সংকলন করে না?
এটাই বাগের কর্কট। বাগ কীভাবে সি # সংকলক স্ট্রাক্টগুলিতে সুনির্দিষ্ট অ্যাসাইনমেন্ট পরীক্ষা করে এবং সংকলকটি কিভাবে লাইব্রেরি থেকে মেটাডেটা লোড করে তার ছেদ করার একটি পরিণতি।
এই বিবেচনা:
struct Foo
{
public int x;
public int y;
}
// Yes, public fields are bad, but this is just
// to illustrate the situation.
void M(out Foo f)
{
ঠিক আছে, এই মুহুর্তে আমরা কী জানি? fপ্রকারের পরিবর্তনের জন্য একটি উপাধি Foo, তাই স্টোরেজটি ইতিমধ্যে বরাদ্দ করা হয়েছে এবং এটি অবশ্যই স্টোরেজ বরাদ্দকারী থেকে বেরিয়ে এসেছিল এমন রাজ্যে অবশ্যই রয়েছে। যদি কলারের দ্বারা চলকটিতে কোনও মান স্থাপন করা হত তবে সেই মানটি সেখানে।
আমাদের কী দরকার? আমাদের প্রয়োজনীয়তা fঅবশ্যই নিয়ন্ত্রণের Mস্বাভাবিকভাবে ছেড়ে যায় এমন যে কোনও সময়ে নিযুক্ত করা উচিত । সুতরাং আপনি যেমন কিছু আশা করতে হবে:
void M(out Foo f)
{
f = new Foo();
}
যা সেট f.xএবং f.yতাদের ডিফল্ট মান। তবে এই কি?
void M(out Foo f)
{
f = new Foo();
f.x = 123;
f.y = 456;
}
এটাও ঠিক থাকতে হবে। তবে, এবং এখানে কিকারটি রয়েছে, কেন আমাদের কেবলমাত্র এক মুহুর্তের পরে এগুলি ছড়িয়ে দেওয়ার জন্য ডিফল্ট মানগুলি অর্পণ করতে হবে? সি # এর নির্দিষ্ট অ্যাসাইনমেন্ট চেকার প্রতিটি ক্ষেত্র নির্ধারিত কিনা তা পরীক্ষা করে দেখুন ! এটি আইনী:
void M(out Foo f)
{
f.x = 123;
f.y = 456;
}
এবং কেন এটি আইনী হওয়া উচিত নয়? এটি একটি মান ধরণের। fএকটি পরিবর্তনশীল, এবং এটি ইতিমধ্যে প্রকারের একটি বৈধ মান রয়েছে Foo, সুতরাং আসুন কেবল ক্ষেত্রগুলি সেট করুন, এবং আমরা শেষ করেছি, তাই না?
ঠিক। তাহলে বাগ কি?
আপনি যে বাগটি আবিষ্কার করেছেন তা হ'ল: ব্যয় সাশ্রয় হিসাবে, সি # সংকলক রেফারেন্সযুক্ত লাইব্রেরিতে থাকা স্ট্রাইকগুলির ব্যক্তিগত ক্ষেত্রগুলির জন্য মেটাডেটা লোড করে না । এই মেটাডেটা বিশাল হতে পারে এবং প্রতিবার মেমরিতে এগুলি লোড করার জন্য খুব কম জয়ের জন্য সংকলকটি ধীর করে দেয়।
এবং এখন আপনি যে বাগটি খুঁজে পেয়েছেন তার কারণটি হ্রাস করতে সক্ষম হওয়া উচিত। সংকলকটি আউট প্যারামিটারটি অবশ্যই নির্ধারিত কিনা তা পরীক্ষা করে দেখুন, এটি নির্দিষ্ট ক্ষেত্রগুলির নির্দিষ্ট সংখ্যার সাথে ক্ষেত্রের সংখ্যার সাথে তুলনা করে এবং আপনার ক্ষেত্রে এটি কেবল শূন্য পাবলিক ফিল্ডগুলির সম্পর্কে জানে কারণ ব্যক্তিগত ক্ষেত্রের মেটাডেটা লোড হয়নি was । সংকলকটি "শূন্য ক্ষেত্র প্রয়োজনীয়, শূন্য ক্ষেত্র শুরু করা, আমরা ভাল,"
যেমনটি আমি বলেছিলাম, এই বাগটি এক দশকেরও বেশি সময় ধরে চলেছে এবং আপনার মতো লোকেরা মাঝে মধ্যে এটি পুনরায় আবিষ্কার করে এবং এটি প্রতিবেদন করে। এটি নির্দোষ, এবং এটি ঠিক হওয়ার সম্ভাবনা নেই কারণ এটি স্থির করা প্রায় শূন্যের উপকারের তবে একটি বড় কর্মক্ষমতা ব্যয়।
এবং অবশ্যই আপনার প্রকল্পের উত্স কোডে থাকা স্ট্রাইকগুলির ব্যক্তিগত ক্ষেত্রগুলির জন্য বাগটি ত্রুটিযুক্ত নয়, কারণ স্পষ্টতই সংকলকটির হাতে থাকা ব্যক্তিগত ক্ষেত্রগুলি সম্পর্কে ইতিমধ্যে তথ্য রয়েছে।