इसके बारे में कोई दो तरीके नहीं हैं। ReSharper के सुझाव और C # के कई उपयोगी फीचर्स का उपयोग तब नहीं किया जाएगा जब आप अपने सभी कोड के लिए अलग-अलग परमाणु इकाई परीक्षण लिख रहे थे।
उदाहरण के लिए, यदि आपके पास एक स्थिर विधि है और आपको इसे बाहर निकालने की आवश्यकता है, तो आप तब तक नहीं कर सकते जब तक आप प्रोफ़ाइल आधारित आइसोलेशन फ्रेमवर्क का उपयोग नहीं करते। लैम्बडा नोटेशन का उपयोग करने के लिए विधि के शीर्ष को बदलने के लिए कॉल-संगत वर्कअराउंड है। उदाहरण के लिए:
इससे पहले:
public static DBConnection ConnectToDB( string dbName, string connectionInfo ) {
}
उपरांत:
public static Func<string, string, DBConnection> ConnectToDB (dbName, connectionInfo ) {
};
दो कॉल-संगत हैं। कॉलर को बदलना नहीं है। फ़ंक्शन का शरीर समान रहता है।
फिर अपने यूनिट-टेस्ट कोड में, आप इस कॉल को इस तरह स्टब कर सकते हैं (यह एक डेटाबेस नामक कक्षा में है):
Database.ConnectToDB = (dbName, connectionInfo) => { return null|whatever; }
आपके द्वारा किए जाने के बाद मूल मूल्य के साथ इसे बदलने के लिए सावधान रहें। आप एक कोशिश के माध्यम से / आखिरकार या अपने यूनिट-टेस्ट में सफाई कर सकते हैं, जिसे हर परीक्षा के बाद बुलाया जाता है, इस तरह से कोड लिखें:
[TestCleanup]
public void Cleanup()
{
typeof(Database).TypeInitializer.Invoke(null, null);
}
जो आपकी कक्षा के स्थिर इनिशियलाइज़र को फिर से लागू करेगा।
लैम्ब्डा फंक नियमित स्थैतिक तरीकों के रूप में समर्थन में समृद्ध नहीं है, इसलिए इस दृष्टिकोण के निम्नलिखित अवांछनीय प्रभाव हैं:
- यदि स्थैतिक विधि एक विस्तार विधि थी, तो आपको इसे पहले एक गैर-विस्तार विधि में बदलना होगा। Resharper आपके लिए यह स्वचालित रूप से कर सकता है।
- यदि किसी भी प्रकार के स्टैटिक तरीके एक एम्बेडेड-इंटरोप असेंबली हैं, जैसे कि ऑफिस के लिए, आपको विधि को लपेटना होगा, टाइप को लपेटना होगा या इसे टाइप करके 'ऑब्जेक्ट' में बदलना होगा।
- अब आप Resharper के परिवर्तन-हस्ताक्षर रिफैक्टरिंग उपकरण का उपयोग नहीं कर सकते।
लेकिन मान लीजिए कि आप स्टैटिक्स से पूरी तरह बचते हैं, और आप इसे एक इंस्टेंस विधि में बदल देते हैं। यह तब भी नकली नहीं है जब तक कि विधि आभासी न हो या इंटरफ़ेस के भाग के रूप में कार्यान्वित न हो।
इसलिए वास्तव में, जो कोई भी स्थिर तरीकों को ठोकर मारने के उपाय का सुझाव देता है, वह उन्हें उदाहरण के तरीके बनाने के लिए है, वे उदाहरण के तरीकों के खिलाफ भी होंगे जो आभासी या इंटरफ़ेस का हिस्सा नहीं हैं।
तो C # में स्थिर विधियाँ क्यों है? यह गैर-आभासी उदाहरण के तरीकों की अनुमति क्यों देता है?
यदि आप इन "सुविधाओं" में से किसी एक का उपयोग करते हैं, तो आप केवल पृथक तरीके नहीं बना सकते हैं।
तो आप उनका उपयोग कब करते हैं?
किसी भी कोड के लिए उनका उपयोग करें, जिसकी आपको उम्मीद नहीं है कि कोई भी कभी भी स्टब आउट करना चाहता है। कुछ उदाहरण: स्ट्रिंग क्लास का स्वरूप () विधि कंसोल क्लास (विधि) कंसोल क्लास की विधि () मैथ क्लास की विधि
और एक और बात .. ज्यादातर लोग इस बारे में परवाह नहीं करेंगे, लेकिन अगर आप एक अप्रत्यक्ष कॉल के प्रदर्शन के बारे में कर सकते हैं, तो यह उदाहरण के तरीकों से बचने का एक और कारण है। ऐसे मामले हैं जब यह एक प्रदर्शन हिट है। इसलिए गैर-आभासी तरीके पहले स्थान पर मौजूद हैं।