2012-08-26 12 views
7

सी # के भीतर एक चर को परिभाषित करने के लिए फ्लाई पर एक नया फ़ंक्शन बनाना संभव है?सी # परिवर्तनीय = नया फ़ंक्शन() {};

मुझे पता है कि

string getResult() { 
    if (a) 
     return "a"; 
    return "b"; 
} 
String result = getResult(); 

संभव है, लेकिन मैं की तरह

String result = new string getResult() { 
    if (a) 
     return "a"; 
    return "b"; 
} 

यह संभव है कुछ के लिए देख रहा हूँ? यदि हां, तो क्या कोई दिखाएगा?

संपादित यह संभव है

संपादित करें: फाइनल - समाधान

यह है कि मैं क्या barbarically एक साथ काट दिया

Func<string> getResult =() => 
{ 
    switch (SC.Status) 
    { 
     case ServiceControllerStatus.Running: 
      return "Running"; 
     case ServiceControllerStatus.Stopped: 
      return "Stopped"; 
     case ServiceControllerStatus.Paused: 
      return "Paused"; 
     case ServiceControllerStatus.StopPending: 
      return "Stopping"; 
     case ServiceControllerStatus.StartPending: 
      return "Starting"; 
     default: 
      return "Status Changing"; 
    } 
}; 

TrayIcon.Text = "Service Status - " + getResult(); 

उत्तर

6

एक तरह से इस तरह के एक समारोह को परिभाषित करने के:

Func<bool, string> getResult = (a) => { 
    if (a) 
     return "a"; 
    return "b"; 
} 

फिर आप आह्वान कर सकते हैं: string foo = getResult(true);। एक प्रतिनिधि के रूप में, जब आवश्यक हो तो इसे संग्रहीत/पास और बुलाया जा सकता है।

उदाहरण:

string Foo(Func<bool, string> resultGetter){ 
    return resultGetter(false); 
} 

भी कर सकते हैं close दायरे के भीतर चर के आसपास:

bool a = true; 

Func<string> getResult =() => { 
    if (a) 
     return "a"; 
    return "b"; 
} 

string result = getResult(); 
+0

(यदि मैं पूछताछ के इरादे को समझता हूं ...) मैं इसके खिलाफ अनुशंसा करता हूं, क्योंकि यह नहीं है कि 'फ़ंक का आमतौर पर उपयोग किया जाता है, और आपके कोड के भविष्य के पाठकों (स्वयं को शामिल) में भ्रमित कर देगा जो अधिक परिचित हैं सामान्य 'Func' उपयोग पैटर्न के साथ। जब तक कि यह वास्तव में एक उदाहरण नहीं है जहां 'Func' या' action' अधिक समझ में आएगा, या तो कोड को रेखांकित करें, या इसे एक अलग विधि बनाएं। –

+0

मुझे असहमत होना होगा। जबकि मुझे नहीं पता कि ओपी की जरूरत क्या है और यह एक समेकित उदाहरण है, परिभाषित करने और बार-बार/सशर्त रूप से/अंततः एक प्रतिनिधि को निष्पादित करने की क्षमता शक्तिशाली और आम दोनों है। लेकिन यह सिर्फ मुझे है। –

+0

यह वास्तव में मेरे लिए काम नहीं करेगा क्योंकि टिम एस ने कहा था। अगर मैं इस मार्ग का उपयोग करना चाहता हूं, तो मैं इसे सिर्फ एक अलग तरीके से परिभाषित करता हूं। ऐसा करने में मेरा एकमात्र वास्तविक उद्देश्य यह आलसी शैली की तरह एक पंक्ति में आलसी शैली को परिभाषित करना था, या जो मुझे विश्वास है वह जावो में भी संभव है। यह समझने पर कि मैं शुरू में इरादा से कठिन हो सकता हूं, मैं उत्सुक था कि इसे कैसे कार्यान्वित किया जा सकता है, अगर इसे वास्तव में कार्यान्वित किया जा सकता है। –

2

के अंतिम परिणाम आप उपयोग करना चाहते हैं अगर बयान में इनलाइन है।

string result = a ? "a" : "b"; 
+0

मैं इस तरह काम करेगा लग रहा है, सिवाय मैं वास्तव में एक स्विच को लागू करने की कोशिश कर रहा हूँ। समझने की कोशिश करने के लिए मैंने अपने कोड में एक कथन के लिए इसे सरल बना दिया। क्या शायद एक इनलाइन स्विच स्टेटमेंट है? –

+1

आप इसे 'शब्दकोश' के साथ कर सकते हैं। –

+0

ए 'डिक्शनरी' एक साधारण स्विच स्टेटमेंट (अपेक्षाकृत बोलने) की तुलना में बहुत अधिक ओवरहेड करता है। आपको आमतौर पर संकलन समय पर ज्ञात तर्क के लिए शब्दकोश का उपयोग करने से बचने की कोशिश करनी चाहिए। – MgSam

0

सुनिश्चित नहीं हैं कि चर a के दायरे अपने उदाहरण में है, लेकिन यह सोचते हैं कि यह के भीतर पहुंचा जा सकता है दायरा (जैसा कि यह आपके उदाहरण में है):

Func<string> getResult =() => 
{ 
    return a ? "a" : "b"; 
} 
+1

'एक्शन कुछ भी वापस नहीं लौटाता है; क्या आपका मतलब 'Func ' था? वैसे भी, मुझे लगता है कि 'var' शायद काम करेगा ... – Ryan

+0

@minitech हां धन्यवाद अद्यतन। –

+0

@minitech, 'var' lambdas के साथ काम नहीं करता है। कंपाइलर के बारे में जानने के लिए पर्याप्त संदर्भ नहीं है कि इसे क्या बनाना है। (कंपाइलर त्रुटि "लम्बा अभिव्यक्ति को एक अंतर्निहित टाइप किए गए स्थानीय चर पर असाइन नहीं कर सकती है") –

0

आपके द्वारा पोस्ट किए गए समाधान के आधार पर, ऐसा करने का एक बेहतर तरीका यहां है।

जोड़ने के लिए अपने ServiceControllerStatus enum बदलें [विवरण] विशेषताएं:

public enum ServiceControllerStatus 
{ 
    [Description("Running")] 
    Running, 
    // ... others 
} 

एक नया स्थिर कक्षा में निम्नलिखित विस्तार विधि जोड़ें:

public static string ToDescription(this Enum value) 
{ 
    var attributes = (DescriptionAttribute[])value.GetType().GetField(value.ToString()).GetCustomAttributes(typeof(DescriptionAttribute), false); 
    return attributes.Length > 0 ? attributes[0].Description : value.ToString(); 
} 

अब आप बस लिख सकते हैं:

TrayIcon.Text = "Service Status - " SC.Status.ToDescription(); 
1

यदि आप वास्तव में इनलाइन चाहते हैं तो आपटाइप करने के लिए एक एक्सटेंशन विधि बना सकते हैं:

static class StringExtensions { 
    public static string ExecuteFunc(
      this string str, 
      Func<string, string> func 
     ) { 
     return func(str); 
    } 
} 

और तब, जब आप इसे उपयोग करना चाहते हैं, तो आप ऐसा इसलिए की तरह कार्य करें:

string str = "foo"; 

string result = str.ExecuteFunc(s => { 
     switch(s){ 
      case "a": 
       return "A"; 
      default: 
       return "B"; 
     } 
    } 
); 
+0

+1। हालांकि यह वास्तव में काम नहीं करता है। इसे एक बार असाइन नहीं किया जा सकता है, लेकिन जब भी बुलाया जाता है उसे असाइन किया जाना चाहिए। – liang