2009-08-21 14 views

उत्तर

23

मान लीजिए आप इस तरह के रूप में एक समारोह है:

private static string toLower(string s) 
{ 
    return s.ToLower(); 
} 

कि दो सामान्य तर्क लेता है, पहले पहले पैरामीटर के प्रकार किया जा रहा है, दूसरी वापसी प्रकार किया जा रहा System.Func का एक संस्करण है। इस तरह के रूप में, आप लिख सकते हैं:

Func<string,string> myFunction = toLower; 
string s = myFunction("AsDf"); 
// s is now "asdf" 

System.Func के सभी संस्करणों में, पिछले सामान्य तर्क वापसी प्रकार है, अन्य सभी मापदंडों के प्रकार, क्रम में हैं।

सिस्टम.फनक उपयोगी है क्योंकि आपको कस्टम प्रतिनिधि प्रकार लिखने की आवश्यकता नहीं है। इससे समान हस्ताक्षर वाले प्रतिनिधियों को इंटरऑप करना बहुत आसान हो जाता है।

कहो मैं था:

public delegate string MyDelegate1(string s); 
public delegate string MyDelegate2(string s); 

MyDelegate1 myDel = new MyDelegate1(toLower); // toLower as above 

अब प्रकार MyDelegate2 का एक उद्देश्य के लिए अपने MyDelegate1 प्रतिनिधि बातचीत करने के लिए कोई रास्ता नहीं है, भले ही वे एक ही विधि का हस्ताक्षर है। दूसरी ओर, अगर हम समारोह का इस्तेमाल किया था इसके बजाय कस्टम प्रतिनिधि प्रकार की घोषणा की है, हम इस समस्या को

5

System.Func<T> आमतौर पर एक और कार्य करने के लिए एक तर्क के रूप में इस्तेमाल किया। यह कोई भी प्रतिनिधि हो सकता है जो टी का मूल्य लौटाता है - और कई तर्कों के साथ एक प्रतिनिधि के रूप में उपयोग करने के लिए कई संस्करण हैं।

फ़िल्टरिंग के लिए एक आम उपयोग है - उदाहरण के लिए, LINQ में, आप एक संग्रह को प्रतिबंधित करने के लिए गणना करने के लिए एक समारोह को पार करने के लिए पास कर सकते हैं। उदाहरण के लिए:

public bool FilterByName(string value) 
{ 
    return value.StartsWith("R"); 
} 

// .. later 

List<string> strings = new List<string> { "Reed", "Fred", "Sam" }; 

var stringsStartingWithR = strings.Where(FilterByName); 

हालांकि, इसके बाद के संस्करण मामले में, आप अधिक होने की संभावना उपयोग लैम्ब्डा भाव चाहते मक्खी पर Func<string,bool> निर्माण करने के लिए, के रूप में:

var stringsStartingWithR = strings.Where(s => s.StartsWith("R")); 
+0

तकनीकी तौर पर, .Where() एक विधेय प्रतिनिधि के लिए पूछता है। लेकिन चूंकि यह सिर्फ फनक का एक विशेष मामला है, ठीक है। –

+4

जोएल: यह नहीं करता है। अनगिनत। (इनमें से (टीएसओआरएस)) (आईनेमेरेबल (ऑफ (टीएसओआरएस)), फनक (ऑफ (टीएसओएस, बूलियन))) देखें: http://msdn.microsoft.com/en-us/library/system.linq। enumerable.where.aspx –

+0

यह विशेष रूप से इसे Func

2
void Foo() 
{ 
    Func<object, bool> func = Bar; 
    bool b1 = func(new object()); // b1 is true 
    bool b2 = func(null); // b2 is false 
} 

bool Bar(object o) 
{ 
    return o == null; 
} 
0

किसी भी प्रतिनिधि प्रकार की वापसी मूल्य होता है प्रतिनिधित्व करने के लिए इसका इस्तेमाल नहीं होगा।

1

1) एक Func उदाहरण बनाएं जिसमें एक पैरामीटर और एक रिटर्न वैल्यू हो। 2) दो पैरामीटर और एक परिणाम के साथ Func उदाहरण। बूल और int प्राप्त करता है, स्ट्रिंग देता है। 3) Func उदाहरण जिसमें कोई पैरामीटर और एक परिणाम मान नहीं है। 4) अज्ञात कार्यों पर Invoke इंस्टेंस विधि को कॉल करें।

सिस्टम का उपयोग कर; वर्ग कार्यक्रम {static void मुख्य() {

Func<int, string> func1 = (x) => string.Format("string = {0}", x); 
Func<bool, int, string> func2 = (b, x) => 
    string.Format("string = {0} and {1}", b, x); 

Func<double> func3 =() => Math.PI/2; 

Console.WriteLine(func1.Invoke(10)); 
Console.WriteLine(func2.Invoke(true, 20)); 
Console.WriteLine(func3.Invoke()); } } 
संबंधित मुद्दे