2010-10-22 11 views
17

सी # में ऑब्जेक्ट प्रारंभकर्ताओं में गुणों के साथ ईवेंट असाइन करना क्यों संभव नहीं है? ऐसा करने के लिए ऐसा बहुत स्वाभाविक प्रतीत होता है।ऑब्जेक्ट प्रारंभकर्ता में घटनाओं को असाइन करना

var myObject = new MyClass() 
    { 
     Property = value, 
     Event1 = actor, 
     // or 
     Event2 += actor 
    }; 

या क्या ऐसी कोई चाल है जिसे मैं नहीं जानता?

+0

ऐसा लगता है कि इस सुविधा अगले भाषा संस्करण http://roslyn.codeplex.com/wikipage?title=Language+Feature+Status – Zarat

+0

तो में जोड़े जाने के लिए जा रहा है आप अभी भी इच्छुक हैं, कृपया यहां मेरा सुझाव देखें: http://stackoverflow.com/questions/24951619/add-event-handler-during-object-initialization/37994490#37994490 –

उत्तर

5

जहां तक ​​बाहरी अनुबंध का संबंध है, एक घटना एक सेटर, केवल add और removeतरीकों नहीं है - ग्राहकों रजिस्टर और घटना से अपंजीकृत कर सकते हैं, और प्रकाशित करने वस्तु का फैसला करता है जब कॉलबैक आह्वान करने के लिए घटना को 'उठाना' द्वारा। नतीजतन, सामान्य रूप से "एक घटना असाइन करना" का विचार व्यर्थ है। जब आप अपने खुद के कार्यान्वयन प्रदान नहीं करते हैं, यह एक निजी बनाता है, समर्थन प्रतिनिधि मैदान:

हालांकि, जब आप एक वर्ग में एक घटना की घोषणा, सी # संकलक तुम क्या वास्तव में है एक सुविधा-सुविधा के साथ प्रदान करता है उचित जोड़ने/निकालने के कार्यान्वयन के साथ, आपके लिए। यह आपको कक्षा के भीतर "ईवेंट सेट करें" (वास्तव में बैकिंग फ़ील्ड) करने की अनुमति देता है, लेकिन इसके बाहर नहीं। यह समझने के लिए, पर विचार करें:

public class Foo 
{ 
    // implemented by compiler 
    public event EventHandler MyEvent; 

    public static Foo FooFactory(EventHandler myEventDefault) 
    { 
     // setting the "event" : perfectly legal 
     return new Foo { MyEvent = myEventDefault }; 
    } 
} 

public class Bar 
{ 
    public static Foo FooFactory(EventHandler myEventDefault) 
    { 
     // meaningless: won't compile 
     return new Foo { MyEvent = myEventDefault }; 
    } 
} 


public class Baz 
{ 
    // custom implementation 
    public event EventHandler MyEvent 
    {  
     add { } // you can imagine some complex implementation here 
     remove { } // and here 
    } 

    public static Baz BazFactory(EventHandler myEventDefault) 
    { 
     // also meaningless: won't compile 
     return new Baz { MyEvent = myEventDefault }; 
    } 
} 
+5

इसका प्रतिबंध के साथ कुछ लेना देना नहीं है। गुणों में सेटर विधियों और निजी बैकिंग फ़ील्ड्स हैं, फिर भी ऑब्जेक्ट प्रारंभकर्ता उन लोगों के साथ ठीक काम करता है। –

3

आप केवल += या -+ ऑपरेटरों का उपयोग अपने मालिक वर्ग के बाहर किसी ईवेंट में कर सकते हैं।

public class Data 
{ 
    public event EventHandler OnSave = (s,e) => 
     { 
     //do something important! 
     }; 

    public void Save() 
    { 
     OnSave(this,null); 
     //do save 
    } 
} 
//outside the class 
Data data = new Data { OnSave = null }; //compile error 
data.OnSave = SomeMethodElse; //compile error 
data.OnSave += MyCustomActionsOnSave; //ok 
data.Save(); 

आप कक्षा में परिभाषित OnSave क्रिया को हटा नहीं सकते हैं। आप कक्षा के बाहर अपने OnSave कार्यों को केवल जोड़/हटा सकते हैं। यदि आप event कीवर्ड को हटाते हैं, तो OnSave अब एक ईवेंट नहीं होगा, बल्कि एक साधारण प्रतिनिधि होगा। फिर आप वर्ग के बाहर मूल्य निर्दिष्ट करने सहित कुछ भी कर सकते हैं।

+0

वह (+ करना चाहते हैं) '+ =' । –

1

यह सी # 6 या सी # 7 नहीं किया (मूल प्रश्न के बाद से), लेकिन यह के खिलाफ फैसला नहीं किया गया है। गिटहब पर एक मुद्दा है जो भाषा प्रस्ताव को ट्रैक करता है। आप इसके लिए वोट दे सकते हैं, साथ ही सुविधा के आस-पास की पिछली चर्चा में लिंक का अनुसरण कर सकते हैं।

https://github.com/dotnet/csharplang/issues/307

आप इस सुविधा को देखने के लिए, उसकी दृश्यता जुटाने में मदद करने के लिए इस मुद्दे को एक थम्स-अप जोड़ने चाहते हैं।

प्रस्तावित वाक्य रचना है:

var timer = new DispatcherTimer { 
    Tick += delegate {}, 
    Interval = TimeSpan.FromSeconds(1d), 
};