सी # हमें to create custom event accessors की अनुमति देता है।क्या एक कंपाइलर जेनरेटेड ईवेंट का बैकिंग फ़ील्ड हमेशा ईवेंट के समान नाम का उपयोग करने की गारंटी देता है?
Action _custom;
public event Action Custom
{
add { _custom = (Action)Delegate.Combine(_custom, value); }
remove { _custom = (Action)Delegate.Remove(_custom, value); }
}
आप उन्हें निर्दिष्ट नहीं करते हैं, the compiler creates them for you। सी # भाषा कल्पना:
जब एक क्षेत्र की तरह घटना संकलन, संकलक स्वचालित रूप से भंडारण प्रतिनिधि धारण करने के लिए बनाता है, और घटना है कि जोड़ सकते हैं या प्रतिनिधि क्षेत्र के लिए ईवेंट हैंडलर्स हटाने के लिए accessors पैदा करता है।
decompiled स्रोत एक सरल public event Action Public;
के लिए dotPeek का उपयोग कर कोड इस प्रकार दिखता है:
private Action Public;
public event Action Public
{
add
{
Action action = this.Public;
Action comparand;
do
{
comparand = action;
action = Interlocked.CompareExchange<Action>(
ref this.Public, comparand + value, comparand);
}
while (action != comparand);
}
remove
{
Action action = this.Public;
Action comparand;
do
{
comparand = action;
action = Interlocked.CompareExchange<Action>(
ref this.Public, comparand - value, comparand);
}
while (action != comparand);
}
}
उल्लेखनीय है कि क्षेत्र और घटना में एक ही नाम का उपयोग करें। इसने निष्कर्ष निकालने के लिए some people का नेतृत्व किया है कि आप कक्षा में फ़ील्ड को ईवेंट के समान नाम से देखकर प्रतिबिंब के दौरान बैकिंग फ़ील्ड के बारे में जानकारी प्राप्त कर सकते हैं।
public static FieldInfo GetFieldInfo(this EventInfo eventInfo)
{
Contract.Requires(eventInfo != null);
return eventInfo.DeclaringType.GetField(
eventInfo.Name,
BindingFlags.DeclaredOnly | BindingFlags.Instance |
BindingFlags.Public | BindingFlags.NonPublic);
}
यह काम करता है, लेकिन सवाल उठता है: एक संकलक उत्पन्न घटना हमेशा घटना के रूप में समान नाम का उपयोग करने की गारंटी के समर्थन क्षेत्र है इस प्रकार मैं इस कार्यान्वित?
कस्टम ईवेंट एक्सेसर्स बनाना संभव नहीं है जो विजुअल स्टूडियो का उपयोग करके एक ही नाम के साथ एक प्रतिनिधि का उपयोग करते हैं। इसके परिणामस्वरूप संदेश: "उसी नाम वाले सदस्य को पहले ही घोषित कर दिया गया है।" मैं सोच रहा हूं कि आप निष्कर्ष निकाल सकते हैं कि कोई भी घटना जिसके लिए एक ही नाम के साथ कोई समर्थन प्रतिनिधि उपलब्ध नहीं है, वह कस्टम एक्सेसर्स के साथ एक कार्यक्रम है।
_ "क्या मैं पूछ सकता हूं कि आप यह सामान क्यों जानना चाहते हैं?" _ 1. क्योंकि यह मजेदार और निर्देशक है! :) 2. मैं [पोस्टशर्प] (http://www.sharpcrafters.com/) का उपयोग करके एक पहलू लिख रहा था, जिसे एक निश्चित बिंदु पर बैकिंग फील्ड प्रतिनिधि के बारे में जानना था। मुझे लगा कि एक समस्या हो सकती है और एक और दृष्टिकोण का उपयोग करने में सक्षम था। –
3. जैसा कि मैंने उदाहरण के साथ उठाई गई कोई समस्या नहीं देखी [यह उत्तर] (http://stackoverflow.com/questions/3783267/how-to-get-a-delegate-object-from-an-eventinfo/3783491#3783491) मुझे लगा कि यह विशेष रूप से यह पूछने योग्य सार्थक हो सकता है। मैं अपने सवालों और जादू तीनों के बीच एक सहसंबंध देखना शुरू कर रहा हूं जो उन्हें जवाब देता है। आपका बहुत बहुत धन्यवाद! :) मुझे यह भी पता है कि मुझे वास्तव में उस सी # spec के माध्यम से पढ़ना शुरू करना चाहिए। दिलचस्प सामान! –
और 100% पूर्ण प्रकटीकरण, मैं एक पहलू लिख रहा हूं जो घटनाओं को बनाते समय _ "प्रतिनिधि {}" _ लिखने की आवश्यकता को समाप्त करता है, [इसलिए मेरा पिछला प्रश्न] (http://stackoverflow.com/q/9823457/590,790)। :) मैं बस इस तरह के सामान से बाहर निकलना मिलता है। भले ही यह _might_ अधिक हो जाए, यह सीखने का एक शानदार तरीका है। :) –