2010-10-25 12 views
14

मैं अब सी # एपीआई को वही रखने में सक्षम होना चाहता हूं जैसा कि अभी है, लेकिन बस एक विधि कॉल में पैरामीटर में से एक को हटा दें। क्या ऐसा करना संभव है, या क्या मुझे पैरामीटर के बिना एक नई विधि बनाने की आवश्यकता है और मूल को अप्रचलित के रूप में चिह्नित करना है?मैं विशिष्ट पैरामीटर को सी # में अप्रचलित/बहिष्कृत के रूप में कैसे चिह्नित कर सकता हूं?

उत्तर

23

लघु जवाब:

आप नए हस्ताक्षर के साथ एक नया nethod बनाते हैं, और अप्रचलित के रूप में वर्तमान चिह्नित करने के लिए की आवश्यकता होगी।

लंबे समय तक जवाब

क्या आप सभी कीमत पर से बचना चाहते हैं एक कोड तोड़ने है! फिर, विशेष रूप से एक कंपनी ढांचे में, आप विज्ञापन देना चाहते हैं कि आपकी विधि अब समर्थित नहीं होगी, उदाहरण के लिए, लेकिन आप आर्किटेक्चर या डिज़ाइन निर्णय या आपकी तरफ से दुर्घटना के समाधान के आधार पर ज़िम्मेदार नहीं बनना चाहते हैं, है ना?

ObsoleteAttribute कक्षा आपके लिए चाल करेगी।

एक बार वर्ग के सदस्य को अप्रचलित के रूप में चिह्नित करने के बाद, क्लाइंट-साइड पर एक चेतावनी उठाई जाएगी, जो आपके ढांचे का उपयोग करते हैं, इस तरह जारी रखने के लिए, या एक ही प्रोजेक्ट के तहत आपके एक सहयोगी को भी।

public class MyClass { 
    [Obsolete("This method should no longer be used, please use MyNewMethod() instead.")] 
    public void MyMethod(string name, long phoneNumber, long faxNumber) { 
    } 

    public void MyNewMethod(string name, long phoneNumber, long faxNumber, string email) { 
    } 
} 

यह MyMethod अब अपने कोड उपयोगकर्ताओं भर समर्थित है कि विज्ञापन करेंगे।

एक निश्चित अवधि के बाद, हर किसी को अपना कोड बदलने की अनुमति देने के लिए पर्याप्त उचित है, तो आप इस विशेषता को एक त्रुटि संदेश फेंकने के लिए कह सकते हैं जब आपकी अप्रचलित विधि अभी भी कोड में उपयोग की जाती है।

public class MyClass { 
    [Obsolete("This method should no longer be used, please use MyNewMethod() instead.", true)] 
    public void MyMethod(string name, long phoneNumber, long faxNumber) { 
    } 

    public void MyNewMethod(string name, long phoneNumber, long faxNumber, string email) { 
    } 
} 

true से पीछे नहीं ObsoleteAttribute वर्ग निर्माता पैरामीटर सेट करके, आप टेलीफोन संकलक एक त्रुटि के रूप में इस पद्धति के उपयोग को विज्ञापित करने के।

कुछ समय के बाद, आप इसे थोड़ा सा साफ करने के लिए अपने कोड से पूरी तरह से अपनी विधि को हटा सकते हैं। यह Agile सॉफ्टवेयर विकास पद्धति द्वारा प्रोत्साहित रिफैक्टरिंग विधियों का हिस्सा है।

क्या इससे मदद मिलती है?

+0

+1। स्टीव उत्तर से अधिक जानकारीपूर्ण – Gorgen

6

हां। आप केवल mark types and members of types as obsolete, व्यक्तिगत पैरामीटर नहीं कर सकते हैं। हालांकि, आप विधि ओवरलोड सकती है, जिससे एक ही नाम रखने और पुराने एक के रूप में अप्रचलित निशान:

class Act 
{ 
    [Obsolete("DoSomething(int, int) is obsolete", false /*warn only*/)] 
    public void DoSomething(int i, int j) 
    { 
    } 

    public void DoSomething(int i) 
    { 
    } 
} 
2

मुझे लगता है कि यह एक नई विधि बनाने के लिए सबसे अच्छा होगा।

पैरामीटर अप्रचलित बनाकर आपका क्या मतलब है? क्या यह उस तर्क के लिए एक विशिष्ट मूल्य पर निर्भर करता है? जब आप कोई विधि कॉल करते हैं, तो आपको हमेशा तर्क निर्दिष्ट करना होगा।

7

हां, मुझे लगता है कि पैरामीटर के बिना एक नई विधि बनाना और मूल को ObsoleteAttribute के साथ चिह्नित करना एकमात्र तरीका है।

+0

+1 बिल्कुल! =) –

7
अप्रचलित विशेषता के साथ

:

[Obsolete("Please use void AnotherMethod() instead", false)] 
void SomeMethod(Int32 data){ 
} 

विशेषता में बूलियन संकलक बताता है, एक चेतावनी उत्पन्न करने के लिए यदि आप इसे सही करने के लिए बदल संकलक एक त्रुटि उत्पन्न होगा। इस पर प्रलेखन के लिए here देखें।

+0

+1 यह जाने का सबसे अच्छा तरीका है! =) –

+0

क्या पूरी विधि को अप्रचलित के रूप में चिह्नित किए बिना ऐसा करना संभव है? – Brian

+1

नहीं, अन्य उत्तरों (जैसे कि क्रिस वालिस) राज्य के रूप में, पैरामीटर अप्रचलित एट्रिब्यूट के लिए एक लक्ष्य नहीं है। अधिक प्रतिस्पर्धी उत्तर और चरणों को वर्तनी के लिए –

संबंधित मुद्दे

 संबंधित मुद्दे