2009-06-03 25 views
10

समारोह और कनवर्टर प्रतिनिधियों के लिए हस्ताक्षर को देखते हुए,Func <T, TResult> और कनवर्टर <TInput, TOutput> के बीच क्या अंतर है?

public delegate TResult Func<T, TResult>(T arg); 
public delegate TOutput Converter<TInput, TOutput>(TInput input); 

मैं दोनों के बीच अंतर को देखने के लिए संघर्ष कर रहा हूँ। निश्चित रूप से, अगर हम सामान्य प्रकार के तर्कों का नाम बदलते हैं, तो वे अनिवार्य रूप से एक ही चीज़ के बराबर होते हैं?

क्या कोई यह समझा सकता है कि वे दोनों क्यों मौजूद हैं, कृपया?

उत्तर

17

कोई फर्क नहीं पड़ता। उनके अस्तित्व का कारण ऐतिहासिक है। Converter<T1,T2> पहले से ही .NET 2.0 में उपलब्ध था, लेकिन Func<> की पूरी श्रृंखला बाद में जोड़े गए थे। स्थिरता के लिए, Func<T,TResult> जोड़ा गया था, लेकिन यह Converter<T1,T2> जैसा ही था।

+0

ने आपको सही जवाब दिया क्योंकि आप पश्चिम में सबसे तेज बंदूक हैं :) –

6

Converter<,> .NET 2.0 में जोड़ा गया था। 3.5 0 (मुझे लगता है) में विभिन्न Func एस जोड़े गए थे। अब, निश्चित रूप से, ढांचे डिजाइनर ने कहा है "अरे, हमें इसके लिए पहले से ही एक सामान्य प्रतिनिधि मिल गया है", लेकिन यह अन्य सभी Func एस के लिए बहुत अजीब लग रहा था और यह नहीं। और ब्रेकिंग चेंज से बचने के लिए Converter जगह पर छोड़ा जाना चाहिए।

  • ThreadStart
  • MethodInvoker
  • Action

सभी एक ही void Foo() हस्ताक्षर है: उदाहरण के लिए -

8

कि कर रहे हैं effictively एक ही प्रतिनिधि प्रकार के बहुत सारे हैं। ऐतिहासिक रूप से, नाम विशिष्ट उपयोग द्वारा चुने गए थे; लेकिन LINQ और देख आगे के साथ, यह स्पष्ट लगता हस्ताक्षर करने पर ध्यान केंद्रित करने के लिए - इसलिए .NET 3.5 में वे Func<...> और Action<...> तरह बातें शुरू की (परिवारों प्रतिनिधियों की)

दुर्भाग्य से, वे भिन्न वास्तव में संगत नहीं हैं स्तर, इसलिए यदि आप दोनों का उपयोग कर रहे हैं तो आपको अक्सर उनके बीच झुकना होगा। जो दर्द है ...

संबंधित मुद्दे