स्ट्रिंग की तरह C # अंतर्निहित प्रकारों का विस्तार कैसे करें?


89

सभी को शुभकामनाएं ... मुझे Trimएक की जरूरत है String। लेकिन मैं स्ट्रिंग के भीतर सभी बार-बार रिक्त स्थानों को हटाना चाहता हूं, न केवल अंत में या इसकी शुरुआत में। मैं इसे एक विधि के साथ कर सकता हूं जैसे:

public static string ConvertWhitespacesToSingleSpaces(string value)
{
    value = Regex.Replace(value, @"\s+", " ");
}

जो मुझे यहां से मिला । लेकिन मैं चाहता हूं कि कोड का यह टुकड़ा String.Trim()खुद के भीतर बुलाया जाए, इसलिए मुझे लगता है कि मुझे Trimविधि का विस्तार करने या ओवरलोड करने या ओवरराइड करने की आवश्यकता है ... क्या ऐसा करने का कोई तरीका है?

अग्रिम में धन्यवाद।

जवाबों:


163

चूंकि आप विस्तार नहीं कर सकते string.Trim()। आप यहां बताए अनुसार एक एक्सटेंशन विधि बना सकते हैं जो ट्रिम्स और व्हाट्सएप को कम करता है।

namespace CustomExtensions
{
    //Extension methods must be defined in a static class
    public static class StringExtension
    {
        // This is the extension method.
        // The first parameter takes the "this" modifier
        // and specifies the type for which the method is defined.
        public static string TrimAndReduce(this string str)
        {
            return ConvertWhitespacesToSingleSpaces(str).Trim();
        }

        public static string ConvertWhitespacesToSingleSpaces(this string value)
        {
            return Regex.Replace(value, @"\s+", " ");
        }
    }
}

आप इसका इस्तेमाल ऐसे कर सकते हैं

using CustomExtensions;

string text = "  I'm    wearing the   cheese.  It isn't wearing me!   ";
text = text.TrimAndReduce();

आपको देता है

text = "I'm wearing the cheese. It isn't wearing me!";

क्या फ़ाइल को एक विशेष नाम की आवश्यकता है? या आप इसे कहाँ बचाते हैं? क्या इसे यूटील क्लास में डाला जा सकता है या ऐसा कुछ?
परीक्षण

1
@testing आप उन्हें अपनी परियोजना में संदर्भित होने तक कहीं भी रख सकते हैं। यदि आप उन्हें किसी विशिष्ट नाम स्थान पर रखते हैं, तो उन्हें किसी अन्य वर्ग की तरह 'उपयोग' कथन के साथ लाएँ।
ट्विसटाइम्स

आपने TrimAndReduce फ़ंक्शन से रेगेक्स को वापस क्यों नहीं किया? इसने आपके उत्तर को पढ़ने में बहुत सरल बना दिया होगा। जब तक आप अपने उत्तर का इतना उपयोग नहीं करते हैं कि आपको कहीं और कॉल करने की आवश्यकता है LOL
quemeful

23

क्या यह संभव है? हां, लेकिन केवल एक विस्तार पद्धति के साथ

वर्ग System.Stringसील कर दिया जाता है ताकि आप ओवरराइडिंग या इनहेरिटेंस का उपयोग न कर सकें।

public static class MyStringExtensions
{
  public static string ConvertWhitespacesToSingleSpaces(this string value)
  {
    return Regex.Replace(value, @"\s+", " ");
  }
}

// usage: 
string s = "test   !";
s = s.ConvertWhitespacesToSingleSpaces();

5
स्पष्ट होने के लिए, नहीं, यह उन क्रियाओं को संशोधित करना संभव नहीं है जो String.Trimलेती हैं।
माइकल पेट्रोत्ता

10

आपके प्रश्न के लिए हाँ और नहीं है।

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

public static string ConvertWhitespacesToSingleSpaces(this string value) {...}

// some time later...
"hello world".ConvertWhitespacesToSingleSpaces()

नहीं, आप इस विधि को नहीं कह सकते Trim() । एक्सटेंशन विधियाँ ओवरलोडिंग में भाग नहीं लेती हैं। मुझे लगता है कि एक संकलक को भी आपको इस बारे में एक त्रुटि संदेश देना चाहिए।

एक्सटेंशन विधियाँ केवल तभी दिखाई देती हैं, यदि नाम विधि के प्रकार को परिभाषित करता है जो विधि का उपयोग करता है।



2

विस्तार के तरीकों का उपयोग करने के अलावा - यहां एक अच्छे उम्मीदवार की संभावना है - यह एक वस्तु को "लपेट" करना भी संभव है (उदाहरण के लिए "ऑब्जेक्ट रचना")। जब तक लिपटे हुए रूप में लिपटे हुए वस्तु की तुलना में अधिक जानकारी नहीं होती है, तब तक लिपटे हुए आइटम को साफ तौर पर निहित या स्पष्ट रूपांतरणों के माध्यम से पारित किया जा सकता है, जिसमें जानकारी का कोई नुकसान नहीं है: बस प्रकार / इंटरफ़ेस का परिवर्तन।

खुश कोडिंग।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.