.NET- এ অন্তর্নির্মিত ইভেন্টআর্গস <টি> আছে?


85

আমি ইভেন্ট আরগগুলির জন্য একটি জেনেরিক ইভেন্টআর্গ ক্লাস তৈরি করতে প্রস্তুত হচ্ছি যা একক যুক্তি বহন করে:

public class EventArg<T> : EventArgs
{
    // Property variable
    private readonly T p_EventData;

    // Constructor
    public EventArg(T data)
    {
        p_EventData = data;
    }

    // Property for EventArgs argument
    public T Data
    {
        get { return p_EventData; }
    }
}

আমি এটি করার আগে, সি # এর কি ভাষাতে একই বৈশিষ্ট্য অন্তর্ভুক্ত ছিল? সি # ২.০ বেরিয়ে এলো এমন কিছু মনে হচ্ছিল মনে হচ্ছে, কিন্তু এখন এটি খুঁজে পাচ্ছি না।

বা অন্যভাবে বলতে গেলে, আমাকে কি আমার নিজস্ব জেনেরিক ইভেন্টআর্গ ক্লাস তৈরি করতে হবে, বা সি # একটি সরবরাহ করে? আপনার সাহায্যের জন্য ধন্যবাদ.


9
আপনি হয়ত দেখেছেনEventhandler<T>
হেন্ক হলটারম্যান

4
আপনি EventArgs<T>সিএবি / এসসিএসএফ-ভিত্তিক কোডটি দেখে থাকতে পারেন । এটি সিএবি / এসসিএসএফ অ্যাপ্লিকেশনগুলিতে বেশ সাধারণ। যদিও এটা কাঠামোর অংশ নয়, সেখানে হয় একটি EventArgs <টি> বাস্তবায়ন।
শন উইলসন

উত্তর:


68

না, আপনি সম্ভবত EventHandler<T>ভেবেছিলেন, যা আপনাকে কোনও নির্দিষ্ট ধরণের ইভেন্টআরগের জন্য প্রতিনিধি নির্ধারণ করতে দেয়।

যদিও আমি ব্যক্তিগতভাবে EventArgs<T>এটি ফিটের পক্ষে বেশ ভাল তা অনুভব করি না । ইভেন্ট আরগগুলিতে "পে-লোড" হিসাবে ব্যবহৃত তথ্যটি আমার মতে এটির ব্যবহার এবং প্রত্যাশিত বৈশিষ্ট্যগুলি খুব পরিষ্কার করার জন্য একটি কাস্টম শ্রেণি হওয়া উচিত। জেনেরিক ক্লাস ব্যবহার করা আপনাকে অর্থবোধক নামগুলি স্থানটিতে রাখতে সক্ষম হতে বাধা দেবে। ("ডেটা" কী উপস্থাপন করে?)


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

4
আমি মনে করি আপনি ঠিক বলেছেন ... যে অলসতা আমাকে এখানে পেয়েছে তার বিরুদ্ধে প্রতিরোধ করুন। এটি অলস বিকাশকারীরা যখন টিপল <,> ব্যবহার করেন তখন like ভয়ানক জিনিস।
ক্রিস

একটি ভাল পয়েন্ট, কিন্তু এটি মূলত মাইক্রোসফ্টের মতো একই জিনিসটি করছিল যখন তারা নিয়ন্ত্রণ সম্পত্তিগুলিতে ট্যাগ সম্পত্তি যুক্ত করেছিল। অবশ্যই, কেবল কোজ 'এমএস এটি করেছে, এটি সঠিক করে তোলে না।
কেন রিচার্ডস

4
আমি প্রথম ভাষ্যকারের সাথে একমত, এই উত্তরটির পুরো দ্বিতীয়ার্ধটি একটি বিষয়গত মতামত / কোড-ধর্ম যা গঠনমূলক ছিল না। :(
BrainSlugs83

6
কেমন করে EventHandler <গ্রাহক> বা EventHandler <অর্ডার> তুলনায় কোন কম তথ্য বহন CustomerEventHandler বা OrderEventHandler ?
Quarkly

33

আমাকে অবশ্যই বলতে হবে যে আমি এখানে সমস্ত 'পিউরিস্ট' বুঝতে পারি না। যেমন আপনার যদি ইতিমধ্যে ব্যাগের ক্লাস সংজ্ঞায়িত থাকে - যার সমস্ত নির্দিষ্টকরণ, বৈশিষ্ট্য ইত্যাদি রয়েছে - তবে হ্যাক কেন ইভেন্ট / আর্গ মেকানিজম, স্বাক্ষরের শৈলী অনুসরণ করতে সক্ষম হতে একটি অতিরিক্ত অযৌক্তিক শ্রেণি তৈরি করে? জিনিসটি হ'ল - নেট-এ থাকা সমস্ত কিছুই নয় - বা "এই বিষয়টির জন্য 'নিখোঁজ' - এটি 'ভাল' - এমএস বছরের পর বছর ধরে নিজেকে 'সংশোধন' করে চলেছে ... আমি বলব যে আমি যাব ঠিক তেমন একটি তৈরি করব - যেমন আমি করেছি - কারণ আমার এটির মতোই দরকার ছিল - এবং আমার অনেক সময় বাঁচিয়েছিল,


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

9
কাউকে লেবেল করার অর্থ এই নয়: ইভেন্টটি পয়েন্টটি 'জেনেরিক' এর মধ্যে রয়েছে - আপনার যদি মাত্র এক ডজন বিভিন্ন ইভেন্টের প্রয়োজন হয়, ঠিক আছে। তবে আপনি যদি টি এর প্রকৃতিটি আগে থেকে না জানেন - যা কেবল রানটাইমের সময় জানা যায় - ভাল, আপনার ধরণের একটি জেনেরিক ইভেন্ট প্রয়োজন। সুতরাং, যদি আপনার কাছে এমন একটি অ্যাপ থাকে যা ডাব্লু / জেনেরিকস, একটি স্বেচ্ছাসেবী # প্রকারের, অজানা - এর একটি ভাল অংশ good বা অর্থাত আছে যে সমস্যার জন্য কোন পরিষ্কার কাটা সমাধান, চলতি রীতি মাত্র একটি চলতি নিয়ম - এবং যে কি আমি purists দ্বারা বোঝানো, প্রতিটি সমাধান ভিন্ন, আপনি জিনিষ, আগপাছ তৌল করা প্রয়োজন
NSGaga-mostly- নিষ্ক্রিয়

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

9

এটি বিদ্যমান আছে। কমপক্ষে, এটি এখন না।

আপনি DataEventArgs<TData>মাইক্রোসফ্টের কয়েকটি পৃথক সভা / নামস্থান সন্ধান করতে পারেন, উদাহরণস্বরূপ মাইক্রোসফ্ট.প্র্যাকটিসস.প্রিসম.এভেন্টস । তবে এগুলি এমন নেমস্পেস যা আপনার প্রকল্পে অন্তর্ভুক্ত করার মতো প্রাকৃতিক জায়গা খুঁজে পাবে না যাতে আপনি কেবল নিজের বাস্তবায়ন ব্যবহার করতে পারেন।


আমি কখন এবং কেন এই জাতীয় জেনারেল ইভেন্টআর্গ ক্লাসটি ব্যবহার করতে পারি সে সম্পর্কে সুপারিশ এবং বিবেচনাগুলি খুঁজতে চেষ্টা করেছি। আরও দেখুন: stackoverflow.com/questions/15766219/...
Ulf Åkerstedt

এখানে কিছু দিক যখন একটি জেনেরিক EventArgs ব্যবহার করে সিদ্ধান্ত নেওয়ার হুঁশিয়ার করছে stackoverflow.com/questions/129453/...
Ulf Åkerstedt

7

আপনি প্রিজমটি ব্যবহার না করার ক্ষেত্রে বেছে নিন , তবে তবুও জেনেরিক ইভেন্টআর্গের পদ্ধতির চেষ্টা করতে চান ।

public class GenericEventArgs<T> : EventArgs
{
    public T EventData { get; private set; }

    public GenericEventArgs(T EventData)
    {
        this.EventData = EventData;
    }
}

// ObjAdded ইভেন্টটি ঘোষণা করতে নিম্নলিখিত নমুনা কোডটি ব্যবহার করুন

public event EventHandler<GenericEventArgs<TargetObjType>> ObjAdded;

// ObjAdded ইভেন্ট বাড়াতে নিম্নলিখিত নমুনা কোড ব্যবহার করুন

private void OnObjAdded(TargetObjType TargetObj)
{
    if (ObjAdded!= null)
    {
        ObjAdded.Invoke(this, new GenericEventArgs<TargetObjType>(TargetObj));
    }
}

// এবং ফিনলেলি আপনি আপনার ObjAdded ইভেন্টটি সাবস্ক্রাইব করতে পারেন

SubscriberObj.ObjAdded +=  (object sender, GenericEventArgs<TargetObjType> e) =>
{
    // Here you can explore your e.EventData properties
};

3

জেনেরিক আরগস নেই বিল্ট ইন। আপনি মাইক্রোসফট EventHandler প্যাটার্ন অনুসরণ, তাহলে আপনি আপনার উদ্ভূত EventArgs মত আপনার প্রস্তাবিত বাস্তবায়ন: public class MyStringChangedEventArgs : EventArgs { public string OldValue { get; set; } }

যাইহোক - যদি আপনার টিমের স্টাইল গাইডটি সরলকরণ গ্রহণ করে - আপনার প্রকল্পটি এই জাতীয় হালকা ওজনের ইভেন্টগুলি ব্যবহার করতে পারে:

public event Action<object, string> MyStringChanged;

ব্যবহার:

// How to rise
private void OnMyStringChanged(string e)
{
    Action<object, string> handler = MyStringChanged;    // thread safeness
    if (handler != null)
    {
        handler(this, e);
    }
}

// How to handle
myObject.MyStringChanged += (sender, e) => Console.WriteLine(e);

সাধারণত একটি পিওসি প্রকল্পগুলি পরের পদ্ধতির ব্যবহার করে। পেশাদার আবেদনকারীদের ক্ষেত্রে, তবে এফএক্স পুলিশের ন্যায্যতা সম্পর্কে সচেতন হন # CA1009: https://msdn.microsoft.com/en-us/library/ms182133.aspx


1

জেনেরিক টাইপের সমস্যাটি হ'ল যদি ডেরিভডটাইপ বেসটাইপ থেকে উত্তরাধিকার সূত্রে প্রাপ্ত হয়, ইভেন্টআর্গস (ডেরিভডটাইপ) ইভেন্টআর্গস (বেসটাইপ) থেকে উত্তরাধিকার সূত্রে প্রাপ্ত হয় না। ইভেন্টআর্গস (বেসটাইপ) ব্যবহার করার ফলে পরে ধরণের উদ্ভূত সংস্করণটি ব্যবহার করা রোধ করা হবে।


4
এটা স্পষ্টতই মিথ্যা। - দয়া করে "Microsoft.com সহভেদাংক এবং Contravariance জেনেরিক্স মধ্যে" দেখুন msdn.microsoft.com/en-us/library/dd799517.aspx
শন উইলসন

4
@ শন উইলসন: কোন দিকটি মিথ্যা? কেউ একটি সমবায় ইন্টারফেস সংজ্ঞায়িত করতে পারে IEventArgs, তবে জেনেরিক ধরণের পরামিতিগুলির ক্ষেত্রে জেনেরিক হতে পারে এমন একমাত্র শ্রেণীর প্রতিনিধিরা যা খাওয়ানো হবে না Delegate.Combine। যে প্রতিনিধিদের সাথে ব্যবহার করা Delegate.Combineহবে সেগুলি সমবায় হওয়া উচিত নয়, যেহেতু কেউ উদাহরণস্বরূপ কোনও Action<DerivedType>ক্ষেত্রের মধ্যে সংরক্ষণ করতে পারে Action<BaseType>তবে Combineউদাহরণের সাথে পরবর্তী প্রচেষ্টা Action<BaseType>ব্যর্থ হবে।
সুপারক্যাট

-4

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

আপনার ডেটা ব্যাগের জন্য কেবল মাত্র একটি স্ট্রিং বা অনুরূপ মৌলিক কিছু না চাইলে, NET- তে সম্ভবত ইভেন্টআর্গ ক্লাসের মান রয়েছে যা আপনি যে সাধারণ উদ্দেশ্যে যাচ্ছেন তা পরিবেশন করার উদ্দেশ্যে।


-1। আমার ঠিক এখন এই স্থবিরতা আছে, এবং আমার পে-লোড একটি অপরিবর্তনীয় জিনিস হবে যা একটি বাস থেকে "বার্তা" আসছে ... এবং অন্যান্য জায়গায়ও রয়েছে sed কাস্টম ইভেন্টআর্গস .... এখানে একটি অপ্রয়োজনীয় শ্রেণি তৈরি করে। অস্বাভাবিক, কিন্তু আবেদন তাই।
টমটম
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.