2012-06-04 34 views
7

मेरे पास निम्नलिखित दो कार्य हैं, जो लगभग समान हैं, केवल अंतर यह है कि कोई func, अन्य action का उपयोग करता है। और यदि संभव हो तो मैं उन्हें एक समारोह में जोड़ना चाहता हूं।सी # शून्य वापसी के साथ Func लिखने का तरीका

private static void TryCatch(Action action) 
    { 
     try 
     { 
      action(); 
     } 
     catch (Exception x) 
     { 
      Emailer.LogError(x); 
      throw; 
     } 
    } 

    private static TResult TryCatch<TResult>(Func<TResult> func) 
    { 
     try 
     { 
      return func(); 
     } 
     catch (Exception x) 
     { 
      Emailer.LogError(x); 
      throw; 
     } 
    } 

उत्तर

3

इन दोनों को सी # में एक समारोह में जोड़ना वास्तव में संभव नहीं है। सी #, और सीएलआर में void, बस एक प्रकार नहीं है और इसलिए गैर-शून्य कार्य से अलग रिटर्न सेमेन्टिक्स है। इस तरह के पैटर्न को सही ढंग से कार्यान्वित करने का एकमात्र तरीका शून्य और गैर-शून्य प्रतिनिधियों के लिए अधिभार प्रदान करना है

सीएलआर सीमा का मतलब यह नहीं है कि प्रत्येक सीएलआर भाषा में करना असंभव है। यह उन भाषाओं में असंभव है जो void का उपयोग ऐसे फ़ंक्शन का प्रतिनिधित्व करने के लिए करते हैं जो कोई मान नहीं देता है। यह पैटर्न एफ # में बहुत ही कामयाब है क्योंकि यह के बजाय के बजाय का उपयोग करता है जो मान वापस करने में विफल रहता है।

+0

कारण है कि यह संभव नहीं है के विवरण के लिए धन्यवाद:

यह सबसे सरल वाक्य रचना मैं पाया है है। – CaffGeek

4

आप अपने दूसरे, Func<T> संस्करण का उपयोग कर सकते हैं, Action विधि को केवल लैम्ब्डा में एक्शन लपेटकर लागू करने के लिए। यह कुछ डुप्लिकेट कोड को समाप्त करता है।

private static void TryCatch(Action action) 
{ 
    Func<object> fun => 
     { 
      action(); 
      return null; 
     }; 
    TryCatch(fun); 
} 

कहा जा रहा है, वहाँ अतिरिक्त भूमि के ऊपर ऐसा करने में शामिल है, इसलिए व्यक्तिगत रूप से, मैं शायद इसे जिस तरह से आप वर्तमान में इसे लागू किया (विशेष रूप से दिए गए कैसे छोटे और सरल अपने मूल संस्करण में होने वाला छोड़ चाहते हैं ये मामला)।

+0

+1 वैकल्पिक वाक्यविन्यास के लिए मेरा उत्तर देखें। –

+0

धन्यवाद, जैसा कि सुझाव दिया गया है, मैं इसे छोड़ दूंगा। बेकार मैं वास्तव में इसे एक समारोह में कम नहीं कर सकता। – CaffGeek

+0

@ चाड नो - आप इसे एक लाइनर बना सकते हैं - मैंने इसे दो में विभाजित कर दिया ताकि आप देख सकें कि क्या हो रहा है, लेकिन आपकी विधि बहुत कम है, मैं इसे छोड़ दूंगा। हालांकि विधि अधिभार को खत्म करने का कोई तरीका नहीं है। –

1

मैं इसे @ReedCopsey के रूप में करता हूं।

private static void TryCatch(Action action) 
{ 
    TryCatch(() => { action(); return 0; }); 
} 
+0

यदि आप Func को पैरामीटर पास करने की आवश्यकता है तो आप यह कैसे करेंगे? – Nicknow