this में यह निर्धारित करने के लिए सबसे तेज़ तरीका है कि किसी संपत्ति में दी गई विशेषता है, उपयोगकर्ता Darin Dimitrov सकारात्मक है कि अभिव्यक्ति पेड़ प्रतिबिंब से सुरक्षित हैं। क्या यह सच है, और यदि हां, तो यह सच क्यों है?अभिव्यक्ति पेड़ प्रतिबिंब से सुरक्षित क्यों हैं?
उत्तर
क्योंकि जब आप अपने क्षेत्र की खोज करते हैं (जैसा कि उस प्रश्न में) आप स्ट्रिंग प्रस्तुति "Id"
का उपयोग करते हैं। एक बार यह बदल जाने के बाद आपका प्रतिबिंब गिर जाएगा।
Expression<Func<Program, int>> expression = p => p.Id;
आप देख:
क्या डैरिन पता चलता है स्थिर टाइपिंग है? यह दिलचस्प है, लेकिन सी # 4.0 कंपाइलर की प्रसिद्ध विशेषता नहीं है: स्वचालित रूप से लैम्ब्डा अभिव्यक्ति से अभिव्यक्ति वृक्ष का निर्माण करें और इसे Expression<T>
पर डालें। तो बाद में आप इसे पार कर सकते हैं और के MemberInfo
प्राप्त कर सकते हैं। लेकिन यह प्रतिबिंब के रूप में सार्वभौमिक नहीं है क्योंकि आप string
द्वारा खोज नहीं कर सकते हैं।
.NET के मेरे सीमित ज्ञान से अभिव्यक्ति वृक्ष का तरीका प्रकार की जांच करना प्रतीत होता है।
जैसा सवाल यह बताया गया है कि क्यों अभिव्यक्ति पेड़ सुरक्षित हैं तो प्रतिबिंब।
उत्तर यह है कि वे प्रतिबिंब का उपयोग कर दोनों हैं।
स्पष्टीकरण के लिए संपादित करें - MemberInfo.GetCustomAttributes एक प्रतिबिंब कॉल है।
http://msdn.microsoft.com/en-us/library/system.reflection.memberinfo.getcustomattributes(VS.71).aspx
सुरक्षा में कुछ अंतर है, इसलिए आप गलत हैं। – Andrey
प्रतिबिंब में कॉल करने के लिए बिंदु प्राप्त करना टाइप सुरक्षित है, और यह एक साफ चाल है। हालांकि दोनों मामलों में अंतिम परिणाम सिस्टम में एक प्रतिबिंब कॉल है। Reflection.MemberInfo.GetCustomAttributes – asawyer
सवाल यह है कि वे अलग कैसे हैं, वे समान कैसे हैं। – Andrey
हम जब उदाहरण के लिए गुण का नाम बदलने को तोड़ने प्रकार सुरक्षा और कोड के बारे में बात कर रहे हैं, अभिव्यक्ति पेड़ "लाभ" अब नकार दिया गया हम() nameof की तरह नए सी # विशेषताएं हैं कि:
अभिव्यक्ति पेड़ रास्ता (nameof से पहले बेहतर() था): नाम से
Expression<Func<YourClass, int>> expression = p => p.Id;
var memberExpression = (MemberExpression)expression.Body;
var property = ((PropertyInfo)memberExpression.Member);
getProperty (पहले nameof (बुरा था)):
var property = typeof(YourClass).GetProperty(nameof(YourClass.Id));
getProperty में स्ट्रिंग इनपुट के बाद से यह "आईडी" के लिए hardcoded किया गया था, सुरक्षित नहीं था, और जब आप ईद संपत्ति का नाम बदला, अपने कोड कार्यावधि में तोड़ अगर आप इस स्ट्रिंग में अच्छी तरह से बदलने के लिए याद नहीं था होता।
इसने अभिव्यक्ति के पेड़ को सुरक्षित बना दिया, क्योंकि आपने संपत्ति के वास्तविक नाम का उपयोग किया था।
लेकिन अब हमारे पास नाम है(), स्ट्रिंग का उपयोग वास्तव में संकलन समय पर संपत्ति का नाम है, और यदि आप संपत्ति का नाम बदलते हैं, और आप/आपका आईडीई उपरोक्त स्निपेट में इसका नाम बदलने के लिए "भूल जाता है" , संकलन समय पर कोड टूट जाएगा।
तो अब पुरानी "खराब रास्ता" मेरी राय में अधिक संक्षिप्त है और संभवतः आपको कम से कम बेहतर प्रदर्शन करता है, क्योंकि आपको अतिरिक्त कास्टिंग की आवश्यकता नहीं है।
- 1. क्या LINQ अभिव्यक्ति पेड़ उचित पेड़ हैं?
- 2. अभिव्यक्ति पेड़
- 3. यूनिट टेस्टिंग अभिव्यक्ति पेड़
- 4. क्या LINQ अभिव्यक्ति पेड़ ट्यूरिंग पूर्ण हैं?
- 5. .NET - पुस्तकालयों में अभिव्यक्ति पेड़?
- 6. बाइनरी पेड़ क्यों महत्वपूर्ण हैं?
- 7. कन्वर्ट अभिव्यक्ति पेड़
- 8. संकलित अभिव्यक्ति पेड़ गलतफहमी?
- 9. जावा अभिव्यक्ति पेड़
- 10. अभिव्यक्ति/वक्तव्य पेड़
- 11. अभिव्यक्ति पेड़ क्या हैं, आप उनका उपयोग कैसे करते हैं, और आप उनका उपयोग क्यों करेंगे?
- 12. गहराई में एक अभिव्यक्ति पेड़
- 13. कोड उद्धरण और अभिव्यक्ति पेड़
- 14. 'स्प्ली' से 'सुरक्षित' सुरक्षित क्यों है?
- 15. स्थानीय चर और अभिव्यक्ति पेड़
- 16. प्रतिबिंब
- 17. इतनी अलग नियमित अभिव्यक्ति बोलियां क्यों हैं?
- 18. प्रतिबिंब धीमा क्यों है?
- 19. कॉम्पैक्ट फ्रेमवर्क में लिंक अभिव्यक्ति पेड़
- 20. अभिव्यक्ति को सुरक्षित करने के कुछ बेहतरीन तरीके क्या हैं?
- 21. फ़ंक्शन पते निरंतर अभिव्यक्ति क्यों नहीं हैं
- 22. सी # 4.0: अभिव्यक्ति पेड़ बनाम कोडडॉम
- 23. कुछ उदाहरण हैं जिनमें अभिव्यक्ति पेड़ उपयोगी होते हैं क्या हैं?
- 24. क्यों Servlets धागे सुरक्षित नहीं हैं?
- 25. अपरिवर्तनीय वस्तुएं थ्रेड-सुरक्षित क्यों हैं?
- 26. त्रुटि: एक अभिव्यक्ति पेड़ एक गतिशील आपरेशन
- 27. शायद अभिव्यक्ति पेड़ का उपयोग कर monad?
- 28. बाइनरी खोज पेड़ क्यों?
- 29. सामान्य पेड़ से बाइनरी पेड़
- 30. सी # गतिशील विधि - आईएल बनाम अभिव्यक्ति पेड़
और यह स्वचालित रीफैक्टरिंग टूल के साथ बेहतर काम करता है क्योंकि उन्हें पता है कि यह एक निश्चित संपत्ति को संदर्भित करता है और यह एक अपारदर्शी स्ट्रिंग नहीं है। – CodesInChaos
क्या गति में कोई अंतर है? – hkon
@ हकॉन कुछ। आपको 'MemberInfo' – Andrey