2015-08-29 5 views
9

दोनों एक ही प्रकार के लौटने लगते हैं, और एक ही हस्ताक्षर हैं।अभिव्यक्ति के बीच क्या अंतर है। वैरिएबल() और अभिव्यक्ति। पैरामीटर()?

तो उनके बीच क्या अंतर है, और हम प्रत्येक का उपयोग कब करना चाहिए?

+2

'Expression.Variable' नहीं' प्रकार ByRef' अनुमति देता है। – PetSerAl

उत्तर

6

Expression.Variable का उपयोग किसी ब्लॉक के भीतर स्थानीय चर घोषित करने के लिए किया जाता है। आने वाले मूल्य के लिए पैरामीटर घोषित करने के लिए Expression.Parameter का उपयोग किया जाता है।

अब वर्तमान में सी # बयान शरीर लैम्ब्डा भाव की अनुमति नहीं है, लेकिन अगर यह किया था, कल्पना:

// Not currently valid, admittedly... 
Expression<Func<int, int>> foo = x => 
{ 
    int y = DateTime.Now.Hour; 
    return x + y; 
}; 

यदि यह मान्य थे, सी # संकलक कोड x के लिए Expression.Parameter का उपयोग कर उत्पन्न होगा , और Expression.Variabley के लिए।

कम से कम, यह मेरी समझ है। यह एक वास्तविक शर्म की बात है कि दो तरीकों के लिए दस्तावेज़ मूलतः एक ही :(

+0

धन्यवाद जॉन! लेकिन जब से वे लौट वही प्रकार, क्या वे केवल ** अर्थात् ** अलग नहीं हैं? –

+1

@shay__: मुझे नहीं पता कि आपका अर्थ केवल "अर्थात् अलग-अलग" है, अर्थात् अर्थशास्त्र का अर्थ है। मैं अभिव्यक्ति के परिणाम की अपेक्षा करूंगा। उदाहरण के लिए अभिव्यक्ति में प्रवेश करने के लिए अमान्य होने के लिए उपलब्ध। उदाहरण के लिए लैम्ब्डा। यह एक शर्म की बात है कि वे एक ही प्रकार के हैं, आईएमओ। –

+0

हां, मेरा मतलब यही है - आप अभिव्यक्ति को कॉल कर सकते हैं। पैरामीटर या अभिव्यक्ति। उपलब्ध है, और इससे कोई फर्क नहीं पड़ता है। "अर्थात्" से मेरा मतलब है कि ** कार्यक्षमता ** समान है, लेकिन उनके पास पाठक के लिए अलग-अलग नाम हैं, या शायद भविष्य की सुविधाओं के लिए ... क्या यह सही है? –

2

प्रभावी ढंग से है, वहाँ तथ्य यह है कि Variable()ref प्रकार की अनुमति नहीं देता कोई अंतर नहीं है, के अलावा है कि देखने के लिए, आप the reference source देख सकते हैं।:

public static ParameterExpression Parameter(Type type, string name) { 
    ContractUtils.RequiresNotNull(type, "type"); 

    if (type == typeof(void)) { 
     throw Error.ArgumentCannotBeOfTypeVoid(); 
    } 

    bool byref = type.IsByRef; 
    if (byref) { 
     type = type.GetElementType(); 
    } 

    return ParameterExpression.Make(type, name, byref); 
} 

public static ParameterExpression Variable(Type type, string name) { 
    ContractUtils.RequiresNotNull(type, "type"); 
    if (type == typeof(void)) throw Error.ArgumentCannotBeOfTypeVoid(); 
    if (type.IsByRef) throw Error.TypeMustNotBeByRef(); 
    return ParameterExpression.Make(type, name, false); 
} 

आप देख सकते हैं, दोनों तरीकों ParameterExpression.Make() फोन, इसलिए लौटे वस्तु एक ही व्यवहार करेगा।

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

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