2011-07-03 16 views
22

क्या सी # में कोई विधि एक विधि लौटा सकती है?क्या सी # विधि एक विधि वापस कर सकती है?

उदाहरण के लिए एक विधि lambda expression वापस कर सकती है, लेकिन मुझे नहीं पता कि मैं इस तरह के तरीके को किस तरह का प्रकार पैरामीटर दे सकता हूं, क्योंकि कोई विधि Type नहीं है। इस तरह की वापसी विधि कुछ प्रतिनिधि को सौंपा जा सकता है।

एक उदाहरण के रूप में इस अवधारणा पर विचार करें:

public <unknown type> QuadraticFunctionMaker(float a , float b , float c) 
{ 
    return (x) => { return a * x * x + b * x + c; }; 
} 

delegate float Function(float x); 
Function QuadraticFunction = QuadraticFunctionMaker(1f,4f,3f); 
+1

आपने पहले ही * आवश्यक प्रतिनिधि प्रकार घोषित कर दिया है। आपका प्रश्न वास्तव में क्या है? –

उत्तर

31

आप जिस प्रकार के लिए खोज रहे हैं Action<> या Func<> हैं।

दोनों प्रकार के सामान्य पैरामीटर विधि के प्रकार हस्ताक्षर निर्धारित करते हैं। यदि आपकी विधि में कोई वापसी मूल्य नहीं है Action का उपयोग करें। यदि इसका रिटर्न वैल्यू Func है, तो अंतिम जेनेरिक पैरामीटर रिटर्न टाइप है।

उदाहरण के लिए:

public void DoSomething()       // Action 
public void DoSomething(int number)    // Action<int> 
public void DoSomething(int number, string text) // Action<int,string> 

public int DoSomething()       // Func<int> 
public int DoSomething(float number)    // Func<float,int> 
public int DoSomething(float number, string text) // Func<float,string,int> 
0

आपका लैम्ब्डा भाव एक float एक पैरामीटर (मेरा मानना ​​है कि) के रूप में ले जाएगा, और फिर एक float लौटने के साथ ही। .NET में, हम Func<float, float> टाइप करके इसका प्रतिनिधित्व कर सकते हैं।

आम तौर पर, यदि आप लैम्बास से निपट रहे हैं जो अधिक पैरामीटर लेते हैं, तो आप आठ पैरामीटर के साथ Func<Type1, Type2, Type3, ..., ReturnType> का उपयोग कर सकते हैं।

15
public Func<float, float> QuadraticFunctionMake(float a, float b, float c) { 
    return x => a * x * x + b * x + c; 
} 

वापसी प्रकार Func<float, float> है।

-1

आप dynamic कीवर्ड का उपयोग कर सकते हैं। dynamic (C# Reference) देखें।

+5

यह सबसे खराब संभव विकल्प है। –

+0

डायनामिक कुंजी, यह सब संकलित समय प्रकार की जांच छोड़ रहा है और इस कीवर्ड का उपयोग समाधान – RaM

+0

के बजाय एक हैक होगा, भले ही यह एक स्थिर प्रकार का समाधान न हो, यह काम करना चाहिए, और उस संबंध में उपयोगी है, भले ही "एक हैक।" – Paul

0

मुझे लगता है कि आपको एक्शन < टी> प्रतिनिधि परिभाषा की आवश्यकता है। मुझे उम्मीद है कि लेख Action<T> Delegate आपकी मदद कर सकता है।

2

<unknown type> = Function। यही है,

public Function QuadraticFunctionMaker(float a , float b , float c) 
{ 
    return (x) => { return a * x * x + b * x + c; }; 
} 

आप के लिए के बाद से आप पहले से ही प्रतिनिधि Function मैच के लिए घोषित किया है जो खोज रहे हैं है। वैकल्पिक रूप से, आपको किसी प्रतिनिधि को घोषित करने की आवश्यकता नहीं है और अन्य लोगों द्वारा देखी गई Func<float, Float> का उपयोग कर सकते हैं। यह बिल्कुल बराबर है। वास्तव में, Func<T, T> ठीक उसी तरह घोषित किया गया है जैसे आपके प्रतिनिधि Function सिवाय इसके कि यह सामान्य है।

+0

'Func <>' और 'action <>' जैसी चीज़ों का उपयोग करना बेहतर है। मेरा मानना ​​है कि एमएस पूरी जगह पर कस्टम प्रतिनिधि होने से दूर जा रहा है। – siride

+0

यह एकमात्र अच्छा जवाब है। मैं हर दूसरे जवाब को वोट दूंगा ... – Jeff

+0

@ साइराइड: नहीं, यह नहीं है।जब आप अपना इरादा स्पष्ट करना चाहते हैं, तो दृढ़ता से परिभाषित प्रतिनिधि बेहतर – Jeff

-3

मुझे लगता है कि, आपकी स्थिति में एक टुपल उपयुक्त होगा। अधिक जानकारी के लिए, यहां देखें http://sankarsan.wordpress.com/2009/11/29/tuple-in-c-4-0/

+2

इस के साथ एक ट्यूपल को क्या करना है? वह जोड़ों या डेटा के ट्रिपल वापस नहीं कर रहा है, वह एक ही मूल्य लौट रहा है। – siride

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