साथ interoperate कर रहे हैं आरएक्स टीम Bart De Smet: Rx Update - .NET 4.5, Async, WinRT द्वारा नवीनतम वीडियो में मैंने देखा कि WinRT घटनाओं वास्तव में कुछ अजीब मेटाडाटा, अधिक preciesly द्वारा नेट से अवगत कराया - add_
/remove_
जोड़ी तरीकों हस्ताक्षर:कैसे WinRT घटनाओं नेट
EventRegistrationToken add_MyEvent(EventHandler<MyEventArgs> handler) { … }
void remove_MyEvent(EventRegistrationToken registrationToken) { … }
यह वास्तव में बहुत अच्छा लग रहा है, पंजीकरण टोकन "निपटान" द्वारा घटना से सदस्यता रद्द करने की अनुमति देता है (आरएक्स एक ही तरह की चीज करता है, विधि Subscribe()
विधि से उदाहरण देता है)। इसलिए घटनाओं से लैम्बा-अभिव्यक्तियों को आसानी से सदस्यता लेना संभव हो गया है, लेकिन ...
तो सी # इस तरह की घटनाओं के साथ काम करने की अनुमति कैसे देता है? .NET में प्रतिनिधि पर एक उदाहरण के साथ एक विधि (स्थिर और उदाहरण) की सदस्यता लेना संभव है और पूरी तरह से एक और प्रतिनिधि उदाहरण के साथ सदस्यता समाप्त करने के लिए एक ही विधि की ओर इशारा किया गया है। इसलिए यदि मैं एक WinRT ईवेंट का उपयोग कर रहा हूं और सी # में कुछ प्रतिनिधि प्रकार के उदाहरण की सदस्यता रद्द कर रहा हूं ... कंपाइलर को सही EventRegistrationToken
कहां मिला? यह जादू कैसे काम करता है?
- - अद्यतन
असल EventRegistrationToken
कि वास्तव में उदासी है, Dispose()
विधि किसी तरह का फोन करके बस सदस्यता समाप्त करने की अनुमति नहीं देता:
public struct EventRegistrationToken
{
internal ulong Value { get; }
internal EventRegistrationToken(ulong value)
public static bool operator ==(EventRegistrationToken left, EventRegistrationToken right)
public static bool operator !=(EventRegistrationToken left, EventRegistrationToken right)
public override bool Equals(object obj)
public override int GetHashCode()
}
- Update2 -
विनरेट इंटरऑपरेबिलिटी वास्तव में वैश्विक रजिस्ट्रार की तालिका का उपयोग करता है प्रबंधित ओबेट्स के साथ WinRT घटनाओं की सदस्यता लेने पर टियन टोकन। उदाहरण के लिए, हैंडलर को हटाने के लिए इंटरऑप कोड इस तरह दिखता है:
internal static void RemoveEventHandler<T>(Action<EventRegistrationToken> removeMethod, T handler)
{
object target = removeMethod.Target;
var eventRegistrationTokenTable = WindowsRuntimeMarshal.ManagedEventRegistrationImpl.GetEventRegistrationTokenTable(target, removeMethod);
EventRegistrationToken obj2;
lock (eventRegistrationTokenTable)
{
List<EventRegistrationToken> list;
if (!eventRegistrationTokenTable.TryGetValue(handler, out list)) return;
if (list == null || list.Count == 0) return;
int index = list.Count - 1;
obj2 = list[index];
list.RemoveAt(index);
}
removeMethod(obj2);
}
यह वास्तव में दुख की बात है।
ध्यान दें कि आपके द्वारा वर्णित सब कुछ एक कार्यान्वयन विस्तार है और किसी भी समय बदला जा सकता है। आपको किसी भी व्यवहार पर भरोसा नहीं करना चाहिए जिसे आप इंजीनियर करते हैं। –