आप जो देख रहे हैं, वह एक अभिव्यक्ति-सदस्य है जो लंबोदर अभिव्यक्ति नहीं है।
जब कंपाइलर एक अभिव्यक्ति-संपन्न संपत्ति सदस्य का सामना करता है , तो यह अनिवार्य रूप से इसे इस तरह एक गेटर में बदल देता है:
public int MaxHealth
{
get
{
return Memory[Address].IsValid ? Memory[Address].Read<int>(Offs.Life.MaxHp) : 0;
}
}
(आप TryRoslyn नामक टूल में कोड को पंप करके अपने लिए इसे सत्यापित कर सकते हैं ।)
अभिव्यक्ति-शारीरिक सदस्य - जैसे अधिकांश C # 6 विशेषताएं - केवल वाक्यविन्यास चीनी हैं । इसका मतलब है कि वे कार्यक्षमता प्रदान नहीं करते हैं जो अन्यथा मौजूदा सुविधाओं के माध्यम से हासिल नहीं की जा सकती हैं। इसके बजाय, ये नई सुविधाएँ अधिक अभिव्यंजक और रसीले वाक्यविन्यास का उपयोग करने की अनुमति देती हैं
जैसा कि आप देख सकते हैं, अभिव्यक्ति-ग्रस्त सदस्यों में कुछ मुट्ठी भर शॉर्टकट हैं जो संपत्ति के सदस्यों को अधिक कॉम्पैक्ट बनाते हैं:
- एक
return
बयान का उपयोग करने की कोई आवश्यकता नहीं है क्योंकि संकलक यह अनुमान लगा सकता है कि आप अभिव्यक्ति के परिणाम को वापस करना चाहते हैं
- एक बयान ब्लॉक बनाने की कोई आवश्यकता नहीं है क्योंकि शरीर केवल एक अभिव्यक्ति है
get
कीवर्ड का उपयोग करने की कोई आवश्यकता नहीं है क्योंकि यह अभिव्यक्ति-शरीर के सदस्य वाक्यविन्यास के उपयोग से निहित है।
मैंने अंतिम बिंदु को साहसिक बना दिया है क्योंकि यह आपके वास्तविक प्रश्न के लिए प्रासंगिक है, जिसका मैं अभी उत्तर दूंगा।
के बीच भिन्नता...
// expression-bodied member property
public int MaxHealth => x ? y:z;
तथा...
// field with field initializer
public int MaxHealth = x ? y:z;
के बीच अंतर के रूप में ही है ...
public int MaxHealth
{
get
{
return x ? y:z;
}
}
तथा...
public int MaxHealth = x ? y:z;
कौन से - यदि आप गुणों को समझते हैं - स्पष्ट होना चाहिए।
बस स्पष्ट होने के लिए, हालांकि: पहली सूची हुड के तहत एक गेट्टर के साथ एक संपत्ति है जिसे हर बार इसे एक्सेस करने के लिए कहा जाएगा। दूसरी लिस्टिंग एक फ़ील्ड इनिशियलाइज़र वाला फ़ील्ड है, जिसकी अभिव्यक्ति का मूल्यांकन केवल एक बार किया जाता है, जब टाइप तत्काल होता है।
वाक्यविन्यास में यह अंतर वास्तव में काफी सूक्ष्म है और इससे "गैचा" हो सकता है, जिसे "एसी # 6 गोचा: इनिशियलाइज़ेशन बनाम एक्सप्रेशन बोडिड मेंबर्स" शीर्षक वाले बिल वाग्नेर द्वारा वर्णित किया गया है ।
जबकि अभिव्यक्ति-ग्रस्त सदस्य लंबोदर अभिव्यक्ति हैं- जैसे , वे लंबोदर अभिव्यक्ति नहीं हैं । मूलभूत अंतर यह है कि एक लंबोदर अभिव्यक्ति या तो एक प्रतिनिधि उदाहरण या एक अभिव्यक्ति पेड़ के रूप में परिणत होती है। एक्सप्रेशन-बॉडी वाले सदस्य कंपाइलर को पर्दे के पीछे एक संपत्ति उत्पन्न करने के लिए एक निर्देश हैं। समानता (अधिक या कम) तीर के साथ शुरू होती है और समाप्त होती है ( =>
)।
मैं यह भी जोड़ूंगा कि अभिव्यक्ति-योग्य सदस्य संपत्ति सदस्यों तक सीमित नहीं हैं। वे इन सभी सदस्यों पर काम करते हैं:
- गुण
- indexers
- तरीके
- ऑपरेटर्स
C # 7.0 में जोड़ा गया
हालाँकि, वे इन सदस्यों पर काम नहीं करते हैं: