इस कोड स्निपेट पर विचार करें और इतने विस्तार विधि द्वारा दिए गए मान के प्रतिलिपि है अनुमान लगाना क्या y1
और y2
ये दो कार्य समान मूल्य क्यों नहीं लौटाते हैं?
static class Extensions
{
public static Func<T> AsDelegate<T>(this T value)
{
return() => value;
}
}
class Program
{
static void Main(string[] args)
{
new Program();
}
Program()
{
double x = Math.PI;
Func<double> ff = x.AsDelegate();
Func<double> fg =() => x;
x = -Math.PI;
double y1 = ff(); // y1 = 3.141..
double y2 = fg(); // y2 = -3.141..
}
}
आप कह सकते हैं -Aha- डबल एक मूल्य के प्रकार है और करने के लिए मूल्यांकन की कोशिश मुख्य x
। लेकिन जब आप उपरोक्त वर्गों के प्रतिनिधियों में बदलते हैं तो परिणाम अभी भी अलग हैं। उदाहरण:
class Foo
{
public double x;
}
Program()
{
Foo foo = new Foo() { x=1.0 };
Func<Foo> ff = foo.AsDelegate();
Func<Foo> fg =() => foo;
foo = new Foo() { x = -1.0 };
double y1 = ff().x; // y1 = 1.0
double y2 = fg().x; // y2 = -1.0
}
तो दोनों कार्यों को एक ही कक्षा के दो अलग-अलग उदाहरण लौटाएंगे। यह मानना दिलचस्प है कि ff()
स्थानीय चर के संदर्भ में foo
का संदर्भ देता है, लेकिन fg()
नहीं है और यह वर्तमान में इस क्षेत्र में निर्भर करता है।
तो क्या होता है जब इन दो प्रतिनिधियों को कोड के अन्य हिस्सों में भेज दिया जाता है, जिनके पास foo
उदाहरण की दृश्यता नहीं है? किसी भी तरह का सवाल है कि किस प्रकार का सूचना है (डेटा) कम और कम स्पष्ट हो रहा है जब विस्तार विधियों को प्रतिनिधियों के साथ जोड़ा जाता है।
ब्रेवटी + स्पष्टता + प्रारूप के कारण इस उत्तर को उत्तर दें। – ja72
मेह ... यह एक है: किसी भी चीज़ के * मूल्य * से बंधे नहीं है (कंपाइलर-कैप्चर क्लास इंस्टेंस उत्पन्न करता है) को छोड़कर, और बी: सख्ती से "x" * से बाध्य नहीं है * - स्पष्ट हां, लेकिन मुझे लगता है कि उस सादगी के कारण शायद थोड़ा भ्रामक लगता है। (सादगी अच्छी है हालांकि) –
@Marc - यह एक टॉस अप है। मैंने इसे लागू करने के तरीके में गोता लगाने के बजाए किसी उपयोगकर्ता को दिखाई देने के तरीके पर ध्यान केंद्रित करने का अनुमान लगाया। – Bevan