का संदर्भ अर्थशास्त्र सशर्त ऑपरेटर (cond ? expr1 : expr2
) के परिणामस्वरूप एक lvalue का उपयोग करने के साथ खेल रहा था।सशर्त ऑपरेटर
उदाहरण निम्नलिखित पर विचार करें
class /*(1)*/ Value {
public int MagicNumber { get; private set; } = 0;
public void Increment() {
/* magical code, that modifies MagicNumber */
}
}
void Main()
{
Value v1, v2;
/*(2)*/ bool condition = /*...*/;
(condition ? v1 : v2).Increment(); // (3)
}
अब, मैं, शक condition
के मूल्य है कि या तो v1
या v2
वृद्धि हो जाता है पर आधारित है। वास्तव में यह मामला है, जब तक Value
((1)
) कक्षा है। एक बार जब मैं इसे struct
को बदलने के लिए, यह मूल्य प्रकार हो जाता है और लाइन (3)
(मुझे लगता है है, क्योंकि या तो v1
या v2
, की नकल की वृद्धि की जाती है और त्याग दिया जाता है) कुछ नहीं करता है। इसके लिए, यह समझ में आता है। अजीब व्यवहार (2)
(condition
) संकलित समय पर ज्ञात होता है (उदाहरण के लिए इसे const bool
परिभाषित करके)। फिर कुछ अनुकूलन खेलने के लिए आता है और v1
या v2
में से एक वास्तव में जगह में वृद्धि हुई है।
मेरा प्रश्न क्या मामला
(condition ? v1 : v2).Increment();
एक बार
v1
और v2
struct
है निम्नलिखित में सशर्त ऑपरेटर की सही व्यवहार होना चाहिए, है। क्या यह वास्तव में संकलन-समय स्थिर होने पर condition
पर निर्भर होना चाहिए?
आप सही हैं कि जब यह एक संरचना है तो यह एक प्रति बना रहा है। यही कारण है कि उत्परिवर्तनीय structs बुराई हैं। http://stackoverflow.com/questions/441309/why-are-mutable-structs-evil – juharr
सी # कंपाइलर बहुत अनुकूलन नहीं करता है, लेकिन यह इस तरह एक कॉन्स अभिव्यक्ति से निपटता है। विचित्र व्यवहार यह है कि आप आमतौर पर "एक संरचना को म्यूट नहीं करते हैं!" सलाह एसओ पर पोस्ट की गई। वह सुंदर नहीं है, मूल्य प्रकार सी # में एक लकी अवशोषण हैं। मुझे लगता है कि आपको [नया अंक बटन] (https://github.com/dotnet/roslyn/issues) पर क्लिक करना चाहिए और माइक्रोसॉफ्ट इंजीनियरों को इस मामले पर वजन देना चाहिए। मुझे संदेह है कि वे इसे ठीक करेंगे, लेकिन कौन जानता है। –