আমি যখন সি # সংকলকের অংশে কিছু অত্যন্ত কৌতূহলী কোড-জেনের মধ্যে দৌড়ালাম তখন অবৈধ-জীবনকাল বাড়ানোর (বৈধভাবে) সম্ভাবনা সম্পর্কে একটি প্রশ্নের উত্তর দিচ্ছিলাম ( যদি তা বিবেচিত হয় তবে 4.0)।
আমি যে সংক্ষিপ্ততম নিন্দা পেতে পারি তা নিম্নলিখিত:
- এমন একটি ল্যাম্বডা তৈরি করুন যা ধারণকারী ধরণের স্ট্যাটিক পদ্ধতিতে কল করার সময় কোনও স্থানীয়কে ক্যাপচার করে ।
- উত্পাদিত প্রতিনিধি-রেফারেন্সটি ধারণকৃত অবজেক্টের উদাহরণ ক্ষেত্রের জন্য বরাদ্দ করুন ।
ফলাফল: সংকলকটি একটি ক্লোজার-অবজেক্ট তৈরি করে যা ল্যাম্বডা তৈরির বিষয়টি উল্লেখ করে, যখন তার কোনও কারণ নেই - প্রতিনিধিটির 'অভ্যন্তরীণ' লক্ষ্য একটি স্থির পদ্ধতি, এবং ল্যাম্বডা-তৈরি-অবজেক্টের উদাহরণ সদস্যদের প্রয়োজন হয় না comp ডেলিগেটের মৃত্যুদণ্ড কার্যকর হওয়ার পরে স্পর্শকাতর হন (এবং না)। কার্যকরভাবে, সংকলক প্রোগ্রামার যেমনটি this
কারণ ছাড়াই ক্যাপচার করেছে হিসাবে কাজ করছে ।
class Foo
{
private Action _field;
public void InstanceMethod()
{
var capturedVariable = Math.Pow(42, 1);
_field = () => StaticMethod(capturedVariable);
}
private static void StaticMethod(double arg) { }
}
একটি রিলিজ বিল্ড থেকে উত্পন্ন কোড ('সরল' সি # তে বিভক্ত) এর মত দেখাচ্ছে:
public void InstanceMethod()
{
<>c__DisplayClass1 CS$<>8__locals2 = new <>c__DisplayClass1();
CS$<>8__locals2.<>4__this = this; // What's this doing here?
CS$<>8__locals2.capturedVariable = Math.Pow(42.0, 1.0);
this._field = new Action(CS$<>8__locals2.<InstanceMethod>b__0);
}
[CompilerGenerated]
private sealed class <>c__DisplayClass1
{
// Fields
public Foo <>4__this; // Never read, only written to.
public double capturedVariable;
// Methods
public void <InstanceMethod>b__0()
{
Foo.StaticMethod(this.capturedVariable);
}
}
মান্য যে <>4__this
অবসান বস্তুর ক্ষেত্র একটি বস্তু রেফারেন্স সহ জনবহুল হয় কিন্তু থেকে (কোন কারন নেই) পড়ুন করা হয় না।
তাহলে এখানে কি হচ্ছে? ভাষা-নির্দিষ্টকরণ কি এর জন্য অনুমতি দেয়? এটি কি কম্পাইলার বাগ / অদ্ভুততা বা অবজেক্টের উল্লেখের জন্য বন্ধ হওয়ার কোনও ভাল কারণ আছে (যা আমি স্পষ্টভাবে অনুপস্থিত)? এটি আমাকে উদ্বিগ্ন করে তোলে কারণ এটি ক্লোজার-হ্যাপি প্রোগ্রামারগুলির (যেমন আমার মতো) অজান্তেই অদ্ভুতভাবে স্মৃতি-ফাঁস (প্রোগ্রামটিকে হ্যান্ডলার হিসাবে ডেলিগেট হিসাবে ব্যবহার করা হত) কল্পনা করার জন্য একটি রেসিপি বলে মনে হয়।
this
।