2010-02-25 15 views
6

स्कूल में वापस आ गया है, हम एक संकलक जहां घुंघराले ब्रेसिज़ सभी भाव को क्रियान्वित करने, और अंतिम मान लौटने के डिफ़ॉल्ट व्यवहार किया था लिखा था ... ताकि आप की तरह कुछ लिख सकते हैं:सी # scoping ऑपरेटर

int foo = { printf("bar"); 1 }; 

वहाँ है सी # में बराबर कुछ? उदाहरण के लिए, यदि मैं एक लैम्ब्डा फ़ंक्शन लिखना चाहता हूं जिसका दुष्प्रभाव है।

बिंदु कम लैम्ब्डा पक्ष प्रभाव (सिर्फ एक उदाहरण), अधिक अगर वहाँ इस कार्यक्षमता है ... तुतलाना में उदाहरण के लिए, आपके पास progn

उत्तर

7

सिद्धांत रूप में होना चाहिए, Vlad से जवाब सही है और आप के रूप में लैम्ब्डा समारोह की घोषणा करने की जरूरत नहीं है अग्रिम में एक प्रतिनिधि।

छोड़कर, स्थिति, सी # में के रूप में सरल नहीं है क्योंकि संकलक तय नहीं कर सकता कि क्या वाक्य-लैम्ब्डा अभिव्यक्ति भी एक प्रतिनिधि (जैसे Func<int>) या एक अभिव्यक्ति पेड़ (जैसे Expression<Func<int>>) के रूप में संकलित और किया जाना चाहिए, यह किसी भी किया जा सकता है अन्य संगत प्रतिनिधि प्रकार।

: - सी # संकलक स्वचालित रूप से प्रतिनिधि प्रकार का अनुमान लगा होगा

int foo = new Func<int>(() => { 
    Console.WriteLine("bar"); return 1; })(); 

आप एक विधि है कि, प्रतिनिधि के रिटर्न को परिभाषित करने और फिर बुला विधि द्वारा कोड थोड़ा आसान बनाने में कर सकते हैं: तो, आप प्रतिनिधि बनाने की जरूरत

static Func<R> Scope<R>(Func<R> f) { return f; } 

// Compiler automatically compiles lambda function 
// as delegate and infers the type arguments of 'Scope' 
int foo = Scope(() => { Console.WriteLine("bar"); return 1; })(); 

मैं मानता हूं कि यह एक बदसूरत चाल है जिसका उपयोग नहीं किया जाना चाहिए :-), लेकिन यह एक दिलचस्प तथ्य है कि यह किया जा सकता है!

7

का दुष्प्रभाव होने से आप को रोकने के कुछ भी नहीं है के बारे में किया जा रहा है एक लैम्ब्डा अभिव्यक्ति।

Func<int> expr =() => 
{ 
    Console.WriteLine("bar"); 
    return 1; 
}; 
int foo = expr(); 
5
int foo = (() => { printf("bar"); return 1; })(); 

संपादित करें: रचनात्मक आलोचना के लिए धन्यवाद, यह

int i = ((Func<int>)(() => { printf("bar"); return 1; }))(); 
+5

यह सही जवाब है - ने कहा, गंभीरता से ऐसा नहीं करने पर विचार करें। –

+2

आप लोग वास्तव में यह जांचना चाहते हैं कि कोड मतदान करने से पहले संकलित करता है या नहीं। यह नहीं करता है। -1। – Aaronaught

+0

हां, हां, 'printf' सी # में मौजूद नहीं है। लेकिन जवाब इसके बारे में नहीं है। – Vlad

3

हमने लैम्ब्डा की परिभाषा के लिए ()=>{M();} से भी अधिक संक्षिप्त वाक्यविन्यास बनाने पर विचार किया है, लेकिन वास्तव में एक वाक्यविन्यास नहीं मिला है जो दोनों अच्छी तरह से पढ़ता है और आसानी से ब्लॉक, संग्रह/ऑब्जेक्ट प्रारंभकर्ताओं के साथ भ्रमित नहीं होता है, या सरणी प्रारंभकर्ता। आप अभी के लिए लैम्ब्डा वाक्यविन्यास से फंस गए हैं।

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