এই পরিদর্শনটি আপনার দৃষ্টি আকর্ষণ করে যে স্পষ্টত দৃশ্যমানের চেয়ে আরও বেশি বন্ধের মান ধরা হচ্ছে যা এর মূল্যবোধগুলির জীবনকালকে প্রভাবিত করে।
নিম্নলিখিত কোড বিবেচনা করুন:
using System;
public class Class1 {
private Action _someAction;
public void Method() {
var obj1 = new object();
var obj2 = new object();
_someAction += () => {
Console.WriteLine(obj1);
Console.WriteLine(obj2);
};
// "Implicitly captured closure: obj2"
_someAction += () => {
Console.WriteLine(obj1);
};
}
}
প্রথম বন্ধে আমরা দেখতে পাচ্ছি যে আপত্তি 1 এবং আপত্তি 2 উভয়ই সুস্পষ্টভাবে বন্দী হয়েছে; আমরা কেবল কোডটি দেখে এটি দেখতে পারি। দ্বিতীয় বন্ধের জন্য আমরা দেখতে পাচ্ছি যে আপত্তি 1 সুস্পষ্টভাবে ক্যাপচার করা হচ্ছে, তবে রিশার্পার আমাদের সতর্ক করে দিচ্ছেন যে আপত্তি 2 সুস্পষ্টভাবে ক্যাপচার করা হচ্ছে।
এটি সি # সংকলকটিতে প্রয়োগের বিশদের কারণে is সংকলনের সময় ক্লোজারগুলি আবার ক্ষেত্রগুলির সাথে ক্লাসে আবার লিখিত হয় যা ক্যাপচারিত মানগুলি ধরে রাখে এবং সেই পদ্ধতিগুলি যা ক্লোজারকেই উপস্থাপন করে। সি # সংকলকটি প্রতি পদ্ধতি অনুসারে কেবলমাত্র এই জাতীয় একটি ক্লাস তৈরি করবে এবং যদি কোনও পদ্ধতিতে একাধিক বন্ধের সংজ্ঞা দেওয়া হয়, তবে এই শ্রেণিতে একাধিক পদ্ধতি থাকবে, প্রতিটি বন্ধের জন্য একটি করে এবং এতে সমস্ত ক্লোজার থেকে সমস্ত ক্যাপচার করা মান অন্তর্ভুক্ত থাকবে।
সংকলকটি যে কোডটি উত্পন্ন করে তা যদি আমরা দেখি তবে এটি দেখতে কিছুটা এ জাতীয় দেখতে পাওয়া যায় (কিছু নাম পড়া সহজ করার জন্য পরিষ্কার করা হয়েছে):
public class Class1 {
[CompilerGenerated]
private sealed class <>c__DisplayClass1_0
{
public object obj1;
public object obj2;
internal void <Method>b__0()
{
Console.WriteLine(obj1);
Console.WriteLine(obj2);
}
internal void <Method>b__1()
{
Console.WriteLine(obj1);
}
}
private Action _someAction;
public void Method()
{
// Create the display class - just one class for both closures
var dc = new Class1.<>c__DisplayClass1_0();
// Capture the closure values as fields on the display class
dc.obj1 = new object();
dc.obj2 = new object();
// Add the display class methods as closure values
_someAction += new Action(dc.<Method>b__0);
_someAction += new Action(dc.<Method>b__1);
}
}
যখন পদ্ধতিটি চলে, তখন এটি প্রদর্শন ক্লাস তৈরি করে, যা সমস্ত ক্লোজারের জন্য সমস্ত মানকে ক্যাপচার করে। সুতরাং বন্ধের কোনওটিতে যদি কোনও মান ব্যবহার না করা হয়, তবুও এটি ধরা পড়বে। রিশার্পার হাইলাইট করছে এটি এটিই "অন্তর্নিহিত" ক্যাপচার।
এই পরিদর্শনটির অর্থ এই যে অবসন্নভাবে ক্যাপচার হওয়া মানটি আবর্জনা সংগ্রহ করা হবে না যতক্ষণ না বন্ধটি নিজেই আবর্জনা সংগ্রহ করা হয়। এই মানটির জীবদ্দশায় এখন বন্ধের জীবনকাল বেঁধে দেওয়া হয়েছে যা মানটি স্পষ্টভাবে ব্যবহার করে না। যদি বন্ধটি দীর্ঘকাল বেঁচে থাকে তবে এটি আপনার কোডে নেতিবাচক প্রভাব ফেলতে পারে, বিশেষত যদি ক্যাপচার মানটি খুব বেশি থাকে large
মনে রাখবেন যে এটি সংকলকের বাস্তবায়ন বিশদ হিসাবে, এটি মাইক্রোসফ্ট (প্রাক এবং পোস্ট রোজলিন) বা মনো এর সংকলক হিসাবে সংস্করণ এবং বাস্তবায়নের সাথে সামঞ্জস্যপূর্ণ। একটি মান ধরণের ক্যাপচারটি একাধিক বন্ধকে সঠিকভাবে পরিচালনা করতে প্রয়োগের অবশ্যই বর্ণিত হিসাবে কাজ করতে হবে। উদাহরণস্বরূপ, যদি একাধিক বন্ধগুলি কোনও ইনট ক্যাপচার করে, তবে তাদের অবশ্যই একই উদাহরণটি ক্যাপচার করতে হবে, যা কেবলমাত্র একটি একক ভাগ করা বেসরকারী নেস্টেড ক্লাসের সাথেই ঘটতে পারে। এর পার্শ্ব প্রতিক্রিয়া হ'ল সমস্ত ক্যাপচারিত মানগুলির জীবনকাল হ'ল যে কোনও মান বন্ধ করে দেওয়ার সর্বোচ্চ আজীবন lifetime