ইভেন্ট হ্যান্ডলারের জন্য ল্যাম্বডা এক্সপ্রেশন ব্যবহার করা


114

আমার কাছে বর্তমানে একটি পৃষ্ঠা রয়েছে যা নীচে ঘোষণা করা হয়েছে:

public partial class MyPage : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        //snip
        MyButton.Click += (o, i) =>
        {
            //snip
        }
    }
}

আমি সম্প্রতি 1.1 থেকে .NET 3.5 এ চলে এসেছি, তাই আমি পেজ_ল্ডের বাইরে ইভেন্ট হ্যান্ডলারগুলি লিখতে অভ্যস্ত। আমার প্রশ্ন; এর জন্য ল্যাম্বডা পদ্ধতিটি ব্যবহার করার সময় আমার কোনও পারফরম্যান্সের ঘাটতি বা সমস্যাগুলি দেখা উচিত? আমি এটি পছন্দ করি, কারণ এটি অবশ্যই আরও সংক্ষিপ্ত, তবে আমি এটি ব্যবহার করতে পারফরম্যান্সের ত্যাগ করতে চাই না। ধন্যবাদ।

উত্তর:


117

সংস্থাপকটি আপনার ল্যাম্বডা অভিব্যক্তিটিকে সমতুল্য প্রতিনিধি হিসাবে অনুবাদ করবে বলে কোনও কার্য সম্পাদনের প্রভাব নেই are ল্যাম্বডা এক্সপ্রেশন কোনও ভাষা বৈশিষ্ট্য ছাড়া আর কিছুই নয় যা সংকলকটি ঠিক একই কোডে অনুবাদ করে যা আপনি কাজ করতে অভ্যস্ত।

সংকলক আপনার কোডটি এমন কিছুতে রূপান্তর করবে:

public partial class MyPage : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        //snip
        MyButton.Click += new EventHandler(delegate (Object o, EventArgs a) 
        {
            //snip
        });
    }
}

আমি দেখি. তাহলে পেজলডের ভিতরে এই হ্যান্ডলারগুলি রাখার তুলনায় এটির বাইরে থাকার কোনও অসুবিধা নেই?
ক্রিস্টোফার গার্সিয়া

1
প্রচলিত কনভেনশনটি OnInitপদ্ধতিতে ইভেন্ট হ্যান্ডলারগুলি সংযুক্ত করা হয় তবে যেহেতু Clickপৃষ্ঠাটি লোড হওয়ার পরে একটি বোতামের ইভেন্ট উত্থাপিত হবে এই উদাহরণটি ঠিক আছে।
অ্যান্ড্রু হ্যারে

8
গুরুত্বপূর্ণ বিষয়টি লক্ষ করুন যে প্রতিনিধিটির কোনও রেফারেন্স ধরে না রেখে আপনি ইভেন্টটি থেকে সাবস্ক্রাইব করতে পারবেন না।
snarf

3
"ঠিক একই কোড" কিছুটা বিভ্রান্তিকর; অন্তত: এনকোলেজিং পদ্ধতি থেকে স্থানীয় ভেরিয়েবলগুলি উল্লেখ করার সময়, ল্যাম্বডা এক্সপ্রেশনগুলি কোনও পদ্ধতিতে এবং কোনও ক্লোজার অবজেক্টের মতো অনুবাদ হয় না যা স্থানীয় ভেরিয়েবলের বর্তমান মানগুলিকে সঞ্চয় করে।
বা ম্যাপার

66

পারফরম্যান্স-ভিত্তিতে এটি একটি নামকৃত পদ্ধতির মতো। আপনি যখন নিম্নলিখিতগুলি করেন তখন বড় সমস্যা হয়:

MyButton.Click -= (o, i) => 
{ 
    //snip 
} 

এটি সম্ভবত অন্যটি ল্যাম্বডাকে অপসারণের চেষ্টা করবে, মূলটি সেখানে রেখে। সুতরাং পাঠটি হ'ল এটি ঠিক আছে যদি না আপনি হ্যান্ডলারটি অপসারণ করতে সক্ষম হন।


3
"এটা সম্ভবত চেষ্টা করবে ..."? এটি কি কখনও এমন পরিস্থিতিতে সঠিক হ্যান্ডলারটি সরিয়ে ফেলবে?
বা ম্যাপার

1
@ ওআরএম্পার: ল্যাম্বদা যদি কোনও ভেরিয়েবল ক্যাপচার করে তবে এটি সঠিক হ্যান্ডলারটি সরাতে পারে না। অন্যান্য পরিস্থিতিতে, এটি সংকলক পর্যন্ত।
গ্যাবে

সত্যি? মজাদার - সুতরাং, যদি আমি দুটি বেনামী ফাংশন একইরকম দেখতে পাই তবে (ব্লগের শূন্য দেহ রয়েছে), এবং তারপরে আমি আরও একটি বেনাম ফাংশনটি নিবন্ধভুক্ত (ব্যবহার করে -=) করছি যা খুব খালি শরীর রয়েছে, এটি মূলত অপরিবর্তিত অপসারণ করা হবে, বা তাদের কোনও একটিও মুছে ফেলা হবে?
অথবা ম্যাপার

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

12
আপনি যদি সত্যিই ল্যাম্বডাটি ব্যবহার করতে চান তবে ইভেন্টটি সরিয়ে ফেলতে চান, আপনি সর্বদা স্থানীয় ভেরিয়েবল / ফিল্ডে অবজেক্টটি ধরে রাখতে পারেন তবে তা মুছে ফেলুন, যেমনvar event = (o, e) => doSomething(); handler += event; doSomethingElse(); handler -= event;
ওয়াই হা লি

44
EventHandler handler = (s, e) => MessageBox.Show("Woho");

button.Click += handler;
button.Click -= handler;

1
অত্যন্ত দরকারী তথ্য, যদিও এটি বিষয় ছাড়াই (প্রশ্নটি কার্য সম্পাদনের বিষয়ে)।
স্টাফেন গৌরিচন

4
ঠিক অফ-টপিক নয়, যেহেতু মেমরির ব্যবহারের ফলে পারফরম্যান্স ডাউনগ্রেড হতে পারে।
ভ্লাদিয়াস

3
নিজেকে কোনও হ্যান্ডলারে মুছে c# EventHandler handler = null; handler = (s, e) => { MessageBox.Show("Woho"); button.Click -= handler;}
ফেলাও

2

যতটা আমি জানি তার ঠিক "সিনট্যাকটিক চিনি" এবং ডেলিগেট সিনট্যাক্স ইত্যাদি ব্যবহারের মতো একই বিষয়টিকে সংকলন করেছি এমন কোনও পারফরম্যান্সের প্রভাবগুলি যা আমি সচেতন বা এর আগে চালিত হয়েছি

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