আমি পুরোপুরি বুঝতে পারি যে আমি যা প্রস্তাব করছি তা। নেট নির্দেশিকা অনুসরণ করে না, এবং তাই কেবল এই কারণেই সম্ভবত একটি দুর্বল ধারণা। তবে, আমি এটি দুটি সম্ভাব্য দৃষ্টিকোণ থেকে বিবেচনা করতে চাই:
(1) আমার নিজের উন্নয়ন কাজের জন্য এটি ব্যবহার করার বিষয়টি বিবেচনা করা উচিত, যা অভ্যন্তরীণ উদ্দেশ্যে 100%।
(২) এটি কী এমন ধারণা যা ফ্রেমওয়ার্ক ডিজাইনাররা পরিবর্তন বা আপডেটের বিষয়ে বিবেচনা করতে পারে?
আমি এমন ইভেন্টের স্বাক্ষরটি ব্যবহার করার বিষয়ে ভাবছি যা এটি 'অবজেক্ট' হিসাবে টাইপ না করে একটি শক্ত টাইপযুক্ত 'প্রেরক' ব্যবহার করে যা বর্তমান। নেট নকশার প্যাটার্ন। এটি হ'ল কোনও স্ট্যান্ডার্ড ইভেন্টের স্বাক্ষর ব্যবহারের পরিবর্তে এটি দেখতে লাগে:
class Publisher
{
public event EventHandler<PublisherEventArgs> SomeEvent;
}
আমি এমন ইভেন্টের স্বাক্ষর ব্যবহার করার বিষয়ে বিবেচনা করছি যা শক্তিশালী টাইপযুক্ত 'প্রেরক' পরামিতিটি ব্যবহার করে:
প্রথমে একটি "স্ট্রং টাইপড এভেন্টহ্যান্ডলার" সংজ্ঞা দিন:
[SerializableAttribute]
public delegate void StrongTypedEventHandler<TSender, TEventArgs>(
TSender sender,
TEventArgs e
)
where TEventArgs : EventArgs;
এটি একটি অ্যাকশন <টিসেন্ডার, টিভেন্টআরগস> এর থেকে আলাদা নয়, তবে এর ব্যবহার করে StrongTypedEventHandler
আমরা প্রয়োগ করি যে টিভেন্টআর্গগুলি থেকে প্রাপ্ত System.EventArgs
।
এর পরে, উদাহরণ হিসাবে, আমরা স্ট্রং টাইপড এভেন্টহ্যান্ডলারটি একটি প্রকাশনা শ্রেণিতে নিম্নরূপ ব্যবহার করতে পারি:
class Publisher
{
public event StrongTypedEventHandler<Publisher, PublisherEventArgs> SomeEvent;
protected void OnSomeEvent()
{
if (SomeEvent != null)
{
SomeEvent(this, new PublisherEventArgs(...));
}
}
}
উপরের ব্যবস্থা গ্রাহকগণকে শক্তিশালী-টাইপ ইভেন্ট হ্যান্ডলারটি ব্যবহার করতে সক্ষম করবে যার জন্য কাস্টিংয়ের প্রয়োজন নেই:
class Subscriber
{
void SomeEventHandler(Publisher sender, PublisherEventArgs e)
{
if (sender.Name == "John Smith")
{
// ...
}
}
}
আমি পুরোপুরি বুঝতে পারি যে এটি স্ট্যান্ডার্ড .NET ইভেন্ট-হ্যান্ডলিং প্যাটার্নের সাথে ভেঙে গেছে; তবে, মনে রাখবেন যে বৈপরীত্য কোনও গ্রাহককে যদি ইচ্ছা হয় তবে একটি traditionalতিহ্যবাহী ইভেন্ট হ্যান্ডলিং স্বাক্ষর ব্যবহার করতে সক্ষম করে:
class Subscriber
{
void SomeEventHandler(object sender, PublisherEventArgs e)
{
if (((Publisher)sender).Name == "John Smith")
{
// ...
}
}
}
এটি হ'ল, যদি কোনও ইভেন্ট হ্যান্ডলারের অবিচ্ছিন্ন (বা সম্ভবত অজানা) অবজেক্টের ধরণের ইভেন্টগুলিতে সাবস্ক্রাইব করার প্রয়োজন হয়, হ্যান্ডলারটি 'প্রেরক' পরামিতিটি 'অবজেক্ট' হিসাবে টাইপ করতে পারে যাতে সম্ভাব্য প্রেরক সামগ্রীর পূর্ণ প্রশস্ততা পরিচালনা করতে পারে।
কনভেনশন ভাঙা ব্যতীত (যা এমন কিছু যা আমি হালকাভাবে নিই না, বিশ্বাস করুন) আমি এটার কোনও উত্থানের কথা ভাবতে পারি না।
এখানে কিছু সিএলএস সম্মতি সংক্রান্ত সমস্যা থাকতে পারে। এটি ভিজ্যুয়াল বেসিক। নেট ২০০ 100% জরিমানা (আমি পরীক্ষা করেছি) এ চলে, তবে আমি বিশ্বাস করি যে ভিজ্যুয়াল বেসিক .NET এর পুরানো সংস্করণগুলি 2005 এর মধ্যবর্তী সময়ে প্রতিনিধিদের সাম্প্রদায়িকতা এবং বিপরীতে নেই। [সম্পাদনা করুন: আমি এর পর থেকে এটি পরীক্ষা করেছি এবং এটি নিশ্চিত হয়ে গেছে: ভিবি.এনইটি 2005 এবং নীচে এটি পরিচালনা করতে পারে না, তবে ভিবি.এনইট ২০০৮ 100% জরিমানা। নীচে "সম্পাদনা # 2" দেখুন]] এখানে অন্যান্যও থাকতে পারে N নেট ভাষাতেও এর সাথে সমস্যা রয়েছে I আমি নিশ্চিত হতে পারি না।
তবে আমি নিজেকে সি # বা ভিজ্যুয়াল বেসিক। নেট ছাড়া অন্য কোনও ভাষার জন্য বিকাশ করতে দেখছি না এবং নেট। ফ্রেমওয়ার্ক 3.0 এবং তারপরের জন্য এটি সি # এবং ভিবি.এনইটি-তে সীমাবদ্ধ রাখতে আমার কোনও আপত্তি নেই। (আমি এই মুহুর্তে 2.0 তে ফিরে যেতে ভাবতে পারি না, সত্যি বলতে।)
অন্য কেউ এই সমস্যা নিয়ে ভাবতে পারেন? অথবা এটি কেবল কনভেনশনটির সাথে এতটা ভেঙে যায় যে এটি মানুষের পেটে মোড় ঘুরিয়ে দেয়?
এখানে কিছু সম্পর্কিত লিঙ্ক পাওয়া গেছে যা আমি পেয়েছি:
(1) ইভেন্ট ডিজাইনের গাইডলাইন [এমএসডিএন 3.5]
(২) সি # সাধারণ ইভেন্ট উত্থাপন - "প্রেরক" বনাম কাস্টম ইভেন্টআরগস [স্ট্যাকওভারফ্লো ২০০৯] ব্যবহার করে
(3) নেট মধ্যে ইভেন্ট স্বাক্ষর নিদর্শন [স্ট্যাকওভারফ্লো ২০০৮]
আমি এই বিষয়ে কারও এবং সবার মতামতে আগ্রহী ...
আগাম ধন্যবাদ,
মাইক
সম্পাদনা # 1: এটি টমি কারিয়ারের পোস্টের প্রতিক্রিয়াতে :
এখানে একটি পরিপূর্ণ কাজের উদাহরণ যা দেখায় যে দৃ strong়-টাইপযুক্ত ইভেন্ট হ্যান্ডলার এবং বর্তমান স্ট্যান্ডার্ড ইভেন্ট হ্যান্ডলার যারা 'অবজেক্ট প্রেরক' পরামিতি ব্যবহার করে তারা এই পদ্ধতির সাথে সহাবস্থান করতে পারে। আপনি কোডটিতে কপি-পেস্ট করতে পারেন এবং এটিকে রান দিতে পারেন:
namespace csScrap.GenericEventHandling
{
class PublisherEventArgs : EventArgs
{
// ...
}
[SerializableAttribute]
public delegate void StrongTypedEventHandler<TSender, TEventArgs>(
TSender sender,
TEventArgs e
)
where TEventArgs : EventArgs;
class Publisher
{
public event StrongTypedEventHandler<Publisher, PublisherEventArgs> SomeEvent;
public void OnSomeEvent()
{
if (SomeEvent != null)
{
SomeEvent(this, new PublisherEventArgs());
}
}
}
class StrongTypedSubscriber
{
public void SomeEventHandler(Publisher sender, PublisherEventArgs e)
{
MessageBox.Show("StrongTypedSubscriber.SomeEventHandler called.");
}
}
class TraditionalSubscriber
{
public void SomeEventHandler(object sender, PublisherEventArgs e)
{
MessageBox.Show("TraditionalSubscriber.SomeEventHandler called.");
}
}
class Tester
{
public static void Main()
{
Publisher publisher = new Publisher();
StrongTypedSubscriber strongTypedSubscriber = new StrongTypedSubscriber();
TraditionalSubscriber traditionalSubscriber = new TraditionalSubscriber();
publisher.SomeEvent += strongTypedSubscriber.SomeEventHandler;
publisher.SomeEvent += traditionalSubscriber.SomeEventHandler;
publisher.OnSomeEvent();
}
}
}
সম্পাদনা # 2: এটি অবিশ্বাস্যতা এবং স্ববিরোধিতা এবং এটি এখানে কীভাবে প্রযোজ্য তা সম্পর্কিত অ্যান্ড্রু হেরের বক্তব্যের প্রতিক্রিয়া হিসাবে । সি # ভাষার প্রতিনিধিদের এত দীর্ঘকাল ধরে সহজাততা এবং বৈপরীত্য ছিল যে এটি কেবল "অন্তর্নিহিত" বোধ করে, তবে তা নয়। এটি এমন কিছু হতে পারে যা সিএলআরে সক্ষম হয়েছে, আমি জানি না, তবে ভিজ্যুয়াল বেসিক। নেট তার প্রতিনিধিদের জন্য .NET ফ্রেমওয়ার্ক 3.0 (VB.NET ২০০৮) অবধি সাম্প্রদায়িকতা এবং বৈপরীত্যের সক্ষমতা পায়নি। এবং ফলস্বরূপ, .NET 2.0 এবং এর নীচে ভিজ্যুয়াল বেসিক.এনইটি এই পদ্ধতির ব্যবহার করতে সক্ষম হবে না।
উদাহরণস্বরূপ, উপরোক্ত উদাহরণটি VB.NET এ নিম্নলিখিত হিসাবে অনুবাদ করা যেতে পারে:
Namespace GenericEventHandling
Class PublisherEventArgs
Inherits EventArgs
' ...
' ...
End Class
<SerializableAttribute()> _
Public Delegate Sub StrongTypedEventHandler(Of TSender, TEventArgs As EventArgs) _
(ByVal sender As TSender, ByVal e As TEventArgs)
Class Publisher
Public Event SomeEvent As StrongTypedEventHandler(Of Publisher, PublisherEventArgs)
Public Sub OnSomeEvent()
RaiseEvent SomeEvent(Me, New PublisherEventArgs)
End Sub
End Class
Class StrongTypedSubscriber
Public Sub SomeEventHandler(ByVal sender As Publisher, ByVal e As PublisherEventArgs)
MessageBox.Show("StrongTypedSubscriber.SomeEventHandler called.")
End Sub
End Class
Class TraditionalSubscriber
Public Sub SomeEventHandler(ByVal sender As Object, ByVal e As PublisherEventArgs)
MessageBox.Show("TraditionalSubscriber.SomeEventHandler called.")
End Sub
End Class
Class Tester
Public Shared Sub Main()
Dim publisher As Publisher = New Publisher
Dim strongTypedSubscriber As StrongTypedSubscriber = New StrongTypedSubscriber
Dim traditionalSubscriber As TraditionalSubscriber = New TraditionalSubscriber
AddHandler publisher.SomeEvent, AddressOf strongTypedSubscriber.SomeEventHandler
AddHandler publisher.SomeEvent, AddressOf traditionalSubscriber.SomeEventHandler
publisher.OnSomeEvent()
End Sub
End Class
End Namespace
VB.NET 2008 এটি 100% জরিমানা চালাতে পারে। তবে আমি এখন এটি VB.NET 2005 এ পরীক্ষা করেছি, নিশ্চিত হওয়ার জন্য, এবং এটি সংকলন করে না, উল্লেখ করে:
পদ্ধতি 'পাবলিক সাব সোমেনভেস্ট হ্যান্ডলার (অবজেক্ট হিসাবে প্রেরক, এবং হিসাবে vbGenericEventHandling.GenericEventHandling.PublisherEventArgs)' এর প্রতিনিধি হিসাবে একই স্বাক্ষর নেই 'ডেলিগেট সাব স্ট্রংটাইপড এভেন্টহ্যান্ডারস প্রকাশক হিসাবে প্রকাশক (টেলিগ্রাহক হিসাবে টেনট্রেজারস হিসাবে)। '
মূলত, প্রতিনিধিরা VB.NET সংস্করণ 2005 এবং এর নীচে নীচে আক্রমণ করে। আমি আসলে কয়েক বছর আগে এই ধারণাটি ভেবেছিলাম, কিন্তু ভিবি.এনইটি এর সাথে এটি মোকাবেলা করতে অক্ষমতা আমাকে বিরক্ত করেছিল ... তবে আমি এখন সি # তে দৃly়ভাবে চলে এসেছি, এবং ভিবি.এনইটি এখন এটি পরিচালনা করতে পারে, তাই, ভাল, তাই এই পোস্ট
সম্পাদনা করুন: আপডেট # 3
ঠিক আছে, আমি এটি বেশ কিছু সময়ের জন্য বেশ সফলভাবে ব্যবহার করে আসছি। এটি সত্যিই একটি দুর্দান্ত সিস্টেম। আমি আমার "স্ট্রংটাইপড এভেন্টহ্যান্ডলার" নামটি "জেনেরিকসেন্টহ্যান্ডলার" হিসাবে নামকরণ করার সিদ্ধান্ত নিয়েছি, নীচে বর্ণিত:
[SerializableAttribute]
public delegate void GenericEventHandler<TSender, TEventArgs>(
TSender sender,
TEventArgs e
)
where TEventArgs : EventArgs;
এই নামকরণের পরিবর্তে, আমি উপরে বর্ণিত হিসাবে ঠিক এটি প্রয়োগ করেছি।
এটি FxCop বিধি CA1009 এর উপর দিয়ে ট্রিপ করে, যা বলে:
"কনভেনশন অনুসারে। নেট ইভেন্টের দুটি পরামিতি রয়েছে যা ইভেন্ট প্রেরক এবং ইভেন্টের ডেটা নির্দিষ্ট করে Event ইভেন্ট হ্যান্ডলার স্বাক্ষরগুলি এই ফর্মটি অনুসরণ করা উচিত: অকার্যকর মাইভেন্টহ্যান্ডলার (অবজেক্ট প্রেরক, ইভেন্টআর্গস ই) The 'প্রেরক' পরামিতি সর্বদা সিস্টেমের হয় O অবজেক্ট, এমনকি যদি আরও নির্দিষ্ট ধরণের নিয়োগ করা সম্ভব হয় তবে 'ই' প্যারামিটার সর্বদা System.EventArgs টাইপ থাকে ts ইভেন্টগুলির ডেটা সরবরাহ করে না এমন ইভেন্টগুলি সিস্টেম.এভেন্টহ্যান্ডলার প্রতিনিধি প্রকারটি ব্যবহার করা উচিত Event ইভেন্ট হ্যান্ডলারের শূন্যতা ফিরে আসে যাতে তারা প্রেরণ করতে পারে প্রতিটি ইভেন্ট একাধিক টার্গেট পদ্ধতিতে। কোনও লক্ষ্য দ্বারা প্রত্যাবর্তিত কোনও মানই প্রথম কলের পরে হারিয়ে যাবে ""
অবশ্যই, আমরা এগুলি সব জানি এবং যাইহোক নিয়মগুলি ভঙ্গ করছি। (সমস্ত ইভেন্ট হ্যান্ডলাররা কোনও ক্ষেত্রে পছন্দসই হলে তাদের স্বাক্ষরে স্ট্যান্ডার্ড 'অবজেক্ট প্রেরক' ব্যবহার করতে পারেন - এটি একটি অ-ব্রেকিং পরিবর্তন))
সুতরাং একটি ব্যবহার SuppressMessageAttribute
কৌশলটি করে:
[SuppressMessage("Microsoft.Design", "CA1009:DeclareEventHandlersCorrectly",
Justification = "Using strong-typed GenericEventHandler<TSender, TEventArgs> event handler pattern.")]
আমি আশা করি এই পদ্ধতির ভবিষ্যতে কোনও এক সময় প্রমিত হয়ে উঠবে। এটি সত্যিই খুব সুন্দরভাবে কাজ করে।
আপনার সকল মতামত বলার জন্য ধন্যবাদ, আমি সত্যিই এটি প্রশংসা ...
মাইক
oh hi this my hom work solve it plz :code dump:
প্রশ্নগুলির মধ্যে একটি নয় , তবে আমরা একটি প্রশ্ন থেকে শিখি ।
EventHandler<,>
চেয়ে নাম দিন GenericEventHandler<,>
। EventHandler<>
বিসিএলে ইতিমধ্যে জেনেরিক রয়েছে যার নাম দেওয়া হয়েছে কেবল ইভেন্টহ্যান্ডলার। সুতরাং ইভেন্টহ্যান্ডলারটি একটি সাধারণ নাম এবং প্রতিনিধিরা প্রকারের ওভারলোডগুলি সমর্থন করে