2008-10-01 20 views
9

मैंने उन सभी अजीब नल चेक को संभालने के लिए एक साधारण सत्र इटैम प्रबंधन वर्ग लिखा है और यदि कोई मौजूद नहीं है तो डिफ़ॉल्ट मान डालें।सी # - मैं एक इनलाइन विधि Func <T> पैरामीटर के रूप में कैसे परिभाषित करूं?

public static T GetItem<T>(string key, Func<T> defaultValue) 
{ 
    if (HttpContext.Current.Session[key] == null) 
    { 
     HttpContext.Current.Session[key] = defaultValue.Invoke(); 
    } 
    return (T)HttpContext.Current.Session[key]; 
} 

अब, मैं वास्तव में इस का उपयोग करते हैं, एक इनलाइन विधि पैरामीटर के रूप में समारोह < टी > में गुजर: यहाँ मेरी GetItem विधि है?

उत्तर

16

के बाद से है कि एक समारोह, एक लैम्ब्डा सबसे आसान तरीका होगा।

तुम भी करने के लिए आसान बनाने में कर सकते हैं:

return ((T)HttpContext.Current.Session[key]) ?? defaultValue(); 

कहाँ ?? नल-कोलेसिंग ऑपरेटर है - यदि पहला तर्क गैर-शून्य है, तो यह वापस आ गया है; अन्यथा दाहिने हाथ का मूल्यांकन किया जाता है और लौटाया जाता है (इसलिए डिफ़ॉल्ट वैल्यू() तब तक नहीं लगाया जाता जब तक कि आइटम शून्य न हो)।

अंत में, आप बस डिफ़ॉल्ट निर्माता उपयोग करना चाहते हैं, तो आप एक "नई()" बाधा जोड़ सकते हैं:

public static T GetItem<T>(string key) 
    where T : new() 
{ 
    return ((T)HttpContext.Current.Session[key]) ?? new T(); 
} 

यह अभी भी आलसी है - नई() केवल आइटम अगर प्रयोग किया जाता है शून्य था

+2

?? संस्करण सत्र में मान सेट नहीं करता है। –

2

आप डिफ़ॉल्ट मान सीधे क्यों नहीं पास करते? मज़ेदार क्या उपयोग है?

वैसे, defaultValue.Invoke() काफी वर्बोज़ है। defaultValue() लिखना भी संभव है।

Foo foo = GetItem<Foo>("abc",() => new Foo("blah")); 

[नई फू ("blah")] कहाँ समारोह है कि एक डिफ़ॉल्ट के रूप में लागू किया जाता है:

+0

मुझे लगता है कि वह डिफ़ॉल्ट मान चाहता है केवल तभी मूल्यांकन किया जाना चाहिए, उदाहरण के लिए यदि डिफ़ॉल्ट मान गणना करने के लिए महंगा है। – OregonGhost

+1

यदि मैं डिफ़ॉल्ट मान सीधे पास करता हूं, तो यदि डिफ़ॉल्ट एक नया ऑब्जेक्ट उदाहरण है, तो मैं हर बार जब मैं GetItem को कॉल करता हूं, तो यह डिफ़ॉल्ट ऑब्जेक्ट बना रहा होगा, भले ही इसका उपयोग किया जा रहा हो या नहीं। एक फनक में डालने से तत्काल आवश्यकता होती है जब इसकी आवश्यकता होती है। – tags2k

+1

यदि आप तत्कालता से निपट रहे हैं, और यदि आप डिफ़ॉल्ट कन्स्ट्रक्टर का उपयोग कर रहे हैं - तो ": new()" सामान्य बाधा सहायक हो सकती है (मैंने अपनी पोस्ट को शामिल करने के लिए संपादित किया है)। गैर-डिफ़ॉल्ट कन्स्ट्रक्टर का उपयोग करते समय Func दृष्टिकोण उपयोगी है। –

1
var log = SessionItem.GetItem("logger",() => NullLog.Instance) 

ध्यान दें, सामान्य रूप से की तुलना में आप कर सकते हैं छोड़ {टी} {GetItem टी} कॉल में विनिर्देश (यदि समारोह {टी} रिटर्न एक ही प्रकार की वस्तु)

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

  • कोई संबंधित समस्या नहीं^_^