सबसे पहले, जॉन, माइकल और जेरेड के उत्तर अनिवार्य रूप से सही हैं लेकिन मेरे पास कुछ और चीजें हैं जिन्हें मैं उनके साथ जोड़ना चाहूंगा।
"अशुद्ध" विधि से क्या अभिप्राय है?
शुद्ध तरीकों को चिह्नित करना आसान है। एक "शुद्ध" विधि में निम्नलिखित विशेषताएं हैं:
- इसका आउटपुट पूरी तरह से इसके इनपुट से निर्धारित होता है; इसका आउटपुट बाहरी लोगों पर निर्भर नहीं करता है जैसे दिन का समय या आपकी हार्ड डिस्क पर बिट्स। इसका उत्पादन इसके इतिहास पर निर्भर नहीं करता है; किसी दिए गए तर्क के साथ विधि को दो बार कॉल करना एक ही परिणाम देना चाहिए।
- एक शुद्ध विधि इसके आसपास की दुनिया में कोई अवलोकन योग्य उत्परिवर्तन पैदा नहीं करती है। एक शुद्ध विधि दक्षता के लिए निजी स्थिति को म्यूट करने का विकल्प चुन सकती है, लेकिन एक शुद्ध विधि अपने तर्क के एक क्षेत्र को म्यूट, नहीं कहती है।
उदाहरण के लिए, Math.Cos
एक शुद्ध विधि है। इसका आउटपुट केवल इसके इनपुट पर निर्भर करता है, और इनपुट कॉल द्वारा नहीं बदला जाता है।
अशुद्ध विधि एक ऐसी विधि है जो शुद्ध नहीं है।
अशुद्ध तरीकों को आसानी से पारित करने के कुछ खतरे क्या हैं?
दो हैं जो दिमाग में आते हैं। पहले एक जॉन, माइकल और जेरेड द्वारा इंगित किया गया है, और यह वह है जिसे रेस्पर आपके बारे में चेतावनी दे रहा है। जब आप किसी संरचना पर एक विधि कहते हैं, तो हम हमेशा उस चर के संदर्भ को पास करते हैं जो रिसीवर है, अगर विधि चर को बदलना चाहती है।
तो क्या हुआ अगर आप एक चर के बजाय एक मूल्य पर ऐसी विधि कहते हैं? उस स्थिति में हम एक अस्थायी चर बनाते हैं, उसमें मान को कॉपी करते हैं, और चर का संदर्भ देते हैं।
एक पठनीय चर को एक मान माना जाता है, क्योंकि इसे कंस्ट्रक्टर के बाहर म्यूट नहीं किया जा सकता है। इसलिए हम चर को दूसरे चर में कॉपी कर रहे हैं, और अशुद्ध विधि संभवतः प्रतिलिपि को म्यूट कर रही है, जब आप इसे चर को बदलना चाहते हैं।
यह एक रिसीवर के रूप में आसानी से एक संरचना को पारित करने का खतरा है । एक संरचना को पारित करने का एक खतरा भी है जिसमें एक रीडोनिली फ़ील्ड शामिल है। एक संरचना जिसमें एक पठनीय क्षेत्र शामिल है, एक सामान्य अभ्यास है, लेकिन यह अनिवार्य रूप से एक चेक लिख रहा है कि प्रकार प्रणाली में नकदी के लिए धन नहीं है; किसी विशेष चर का "रीड-ओनली-नेस" स्टोरेज के मालिक द्वारा निर्धारित किया जाता है। एक संदर्भ प्रकार का एक उदाहरण "स्वयं का भंडारण" करता है, लेकिन मूल्य प्रकार का एक उदाहरण नहीं होता है!
struct S
{
private readonly int x;
public S(int x) { this.x = x; }
public void Badness(ref S s)
{
Console.WriteLine(this.x);
s = new S(this.x + 1);
Console.WriteLine(this.x);
}
}
एक सोचता है कि this.x
परिवर्तन नहीं होने वाला है क्योंकि x एक पठनीय क्षेत्र है और एक रचनाकार Badness
नहीं है। परंतु...
S s = new S(1);
s.Badness(ref s);
... स्पष्ट रूप से उस के झूठ को दर्शाता है। this
और s
एक ही चर का संदर्भ लें, और वह चर आसानी से पढ़ा नहीं जाता है!