सवाल सी # और वीबी.Net के बीच अभिव्यक्ति वृक्ष अंतर


मेरे पास अभिव्यक्ति वृक्षों पर काम कर रहे पुस्तकालय हैं। लाइब्रेरी को सी # और वीबी.Net दोनों के साथ काम करने की आवश्यकता है

अभिव्यक्ति वृक्षों का निर्माण कैसे किया जाता है, इस बारे में भाषाओं के बीच कुछ मतभेदों को नोटिस किया गया

  • स्ट्रिंग तुलना
    () => "a" == "b" हो जाता है Expression.Equals("a", "b")
    Function() "a" = "b" हो जाता है Expression.Equals(Expression.Call(CompareString, "a", "b"), 0)
    (मैं समझता हूं कि वीबी.Net यहां तुलनास्ट्रिंग का उपयोग क्यों करता है)

  • स्ट्रिंग concatenation
    () => "a" + "b" हो जाता है Expression.Add("a", "b", String.Concat)
    Function() "a" & "b" हो जाता है Expression.Call(String.Concat, "a", "b")

  • अनुकूलन?
    () => !(1 == 2) हो जाता है Expression.Not(Expression.Equals(1, 2))
    Function() Not (1 = 2) हो जाता है Expression.NotEqual(1, 2) 

मेरी लाइब्रेरी इन सभी मतभेदों को संभालती है लेकिन क्या मुझे और अधिक मतभेद हैं जिनके लिए मुझे देखने की ज़रूरत है?

संपादित करें मेरे कोड के बारे में कुछ स्पष्टीकरण।

जिस सिस्टम के साथ मैं काम करता हूं उसके पास दस्तावेज़ों के लिए एक फ़िल्टर होता है जिसे आप इस तरह निर्दिष्ट करते हैं:

var filter = document.Filter;
filter.LeftParanthesis();
filter.Column(columnNumber);
filter.Equals();
filter.Value("abc");
filter.RightParanthesis();
filter.And();
filter.LeftParanthesis();
...
document.Refresh();

फिल्टर का उपयोग करना आसान बनाने के लिए मेरा कोड आपको फ़िल्टर को निर्दिष्ट करने की अनुमति देता है Expression<Func<bool>> लैम्ब्डा।

Expression<Func<bool>> filter = () => (123.AsStringColumn() == "abc") && (...);
filter.Apply(document);

मेरा कोड तब अभिव्यक्ति वृक्ष को पुन: सक्रिय करता है और ऊपर निर्दिष्ट अनुसार दस्तावेज़ फ़िल्टर विधियों को कॉल करता है। फिल्टर में आपके द्वारा लैम्ब्डा में रखे गए सभी चीज़ों के लिए समर्थन नहीं है। विधि कॉल सबसे स्पष्ट है।

चूंकि वीबी.Net कुछ मामलों में विधि कॉल उत्पन्न करता है जहां सी # मुझे इन्हें रोकने और उन्हें अलग-अलग संभालने की आवश्यकता नहीं है।


49
2018-04-19 11:25


मूल


कब्जा-चर, अज्ञात प्रकार, और अपारदर्शी पहचानकर्ता (let) शायद कुछ प्यार की जरूरत है; मुझे संदेह है कि यह खुला है, हालांकि - Marc Gravell♦
के साथ निहित रूपांतरण के लिए देखो option strict off वीबी.नेट में वास्तव में कोई अंतर नहीं है क्योंकि सी # इसका समर्थन नहीं करता है, लेकिन यह उन अतिरिक्त कॉलों को पेश कर सकता है जिन्हें आप संभालने में रुचि रखते हैं। - Julien Lebosquain
हम एक सी # लाइब्रेरी का उपयोग करते हैं जो अभिव्यक्ति पेड़ों को उत्पन्न और उत्परिवर्तित करता है और वीबी उपयोगकर्ताओं के साथ-साथ सी # उपयोगकर्ताओं द्वारा भारी रूप से उपयोग किया जाता है। हमारे पास किसी भी अंतर को संभालने के लिए कोई विशेष कोड नहीं है, इसलिए मुझे यकीन नहीं है कि यहां एक वास्तविक समस्या है। आपको दोनों भाषाओं में lib लिखने की आवश्यकता नहीं है, आपको बस इसे दोनों भाषाओं में उपभोग करने की आवश्यकता है। - Jay Traband
यह मेरे प्रश्न के समान दिखता है जिसे मैंने कुछ साल पहले पूछा था। stackoverflow.com/questions/6742972/... - Phill
इसके बजाय, क्या आप डायनामिक LINQ देख सकते हैं? यहां तक ​​कि अगर वीबी थोड़ा अलग लैम्ब्डा उत्पन्न करता है, तो आप क्यों नहीं संकलित करते हैं और लैम्ब्डा का आह्वान करते हैं, तो आपको उन्हें क्यों रोकना पड़ता है? यदि आप IList या ICollection या IENumerable को सही तरीके से कार्यान्वित करते हैं, तो आपको लैम्ब्डा के साथ कुछ भी करने की ज़रूरत नहीं है, लिंक अपने काम को ध्यान में रखेगा। - Akash Kava


जवाब:


/ विभाजन ऑपरेटर सी # और वीबी में अलग-अलग काम करता है। सी # में यह उपयोग किए गए डेटा प्रकारों को अनुकूलित करता है, जबकि वीबी हमेशा ऑपरेटरों को फ्लोटिंग पॉइंट मानों में परिवर्तित करता है:

() => 1 / 2 हो जाता है Expression.Divide(1, 2)
Function() 1 / 2 हो जाता है Expression.Divide(Expression.Convert(1, Double), Expression.Convert(2, Double))

वीबी में आपको इसका उपयोग करने की आवश्यकता होगी \ पूर्णांक विभाजन के लिए ऑपरेटर और / फ्लोटिंग प्वाइंट डिवीजन के लिए समान के रूप में प्राप्त करने के लिए / ऑपरेटर सी # में।


6
2018-05-05 08:37



धन्यवाद। मुझे लगता है कि इसे संभालने का सबसे अच्छा तरीका (मेरे लिए) रूपांतरण त्रुटि संदेश में इसका उल्लेख करना है। - adrianm
@ डेवमार्क: क्या? - Guffa
माफ़ कीजिये। वीबी के quirks मुझे पागल ड्राइव - मेरा मतलब है - एक पीछे की ओर स्लैश? Uck! - Dave Markle


मुझे सी # और वीबी.Net के साथ काम करना पड़ता था, जो अक्सर मेरे प्रोजेक्ट से संबंधित था और अधिकांश अंतर जो मैंने देखा था जब वीबी.Net असुरक्षित मोड में है। यानी अगर हम VB.Net टाइपएफ़ (विकल्प पर सख्त विकल्प, विकल्प पर स्पष्टीकरण ... विकल्प को चालू करते हैं) तो यह सी # की तरह काम करेगा।


2
2018-05-10 14:06