2009-09-24 10 views
6

मुझे सी # में एक पाठ पार्सर पर काम करते समय अक्सर एक स्ट्रिंग की पहली पंक्ति को हटाने के लिए मिला। मैंने इसे मेरे लिए करने के लिए एक सरल कार्य रखा है, लेकिन एक PHP पृष्ठभूमि से आ रहा है, मुझे नहीं पता कि इसे कहां रखा जाए क्योंकि मैं कक्षा के बाहर एक समारोह को परिभाषित नहीं कर सकता। .NET में ऐसा करने का एक पारंपरिक तरीका क्या है? क्या मैं अपने फ़ंक्शन को स्टोर करने के लिए एक स्थिर वर्ग बना सकता हूं?मुझे .NET प्रोजेक्ट में विविध कार्यों को कहां रखा जाना चाहिए?

+1

किस तरह की .NET परियोजना? ASP.NET? एएसपी.नेट एमवीसी? WinForms? सिल्वरलाइट? परियोजना के प्रकार के आधार पर "इसे कहां रखा जाए" के लिए सम्मेलन अलग-अलग हैं। – Portman

+0

वह WinForms होगा। –

उत्तर

18

हाँ, स्थिर सहायक वर्गों आमतौर पर जिस तरह से यह करने के लिए कर रहे हैं।

इसके अलावा, # 3 सी में आप इस तरह प्रणाली की घोषणा कर सकते हैं:

public static string RemoveFirstLine(this string s) { 
    ... 
} 

यह एक विस्तार विधि बनाने के लिए। फिर आप इसे किसी भी स्ट्रिंग पर कॉल कर सकते हैं जैसे कि स्ट्रिंग प्रकार पर विधि घोषित की गई थी।

+0

तितली का वर्णन करने के लिए, विस्तार विधियां निश्चित रूप से जाने का तरीका हैं। – Bomlin

+0

वाह, विस्तार विधियां साफ हैं! मैं यही उपयोग कर समाप्त हुआ। उनका उल्लेख करने के लिए धन्यवाद। –

20

मैं आम तौर पर एक सहायक या उपयोगिता स्थैतिक वर्ग बना देता हूं और फिर वहां सहायक सहायक कार्य करता हूं।

इसके अतिरिक्त, मैं हेल्पर और उपयोगिता वर्गों को तार्किक रूप से समूहीकृत रखने की कोशिश करता हूं - ऑब्जेक्ट रूपांतरण कार्यों के साथ टेक्स्ट पार्सिंग फ़ंक्शंस को गैरकानूनी बनाना है। भ्रम को एक टेक्स्टयूट्स क्लास और एक रूपांतरण यूटिल क्लास के साथ साफ़ कर दिया गया है।

+0

+1 ने मुझे इसे हरा दिया। –

+6

आपको शायद ऐसे फ़ंक्शंस एक्सटेंशन विधियों को बनाने से भी फायदा होगा। –

2

आमतौर पर मैं उपयोगिता वर्ग बनाता हूं और स्थिर सहायक विधियों को परिभाषित करता हूं।

4

मुझे नहीं लगता कि इसके लिए एक मानक है। मैं BlahUtil नामक एक स्थिर वर्ग बनाने के लिए जाते हैं। आपके उदाहरण के लिए, मैं इसे StringUtil पर एक स्थिर विधि बना दूंगा। इससे मुझे समझदार इकाइयों में समूह से संबंधित तरीकों में मदद मिलती है, जिससे उन्हें खोजना आसान हो जाता है और उन्हें टीमों में साझा किया जा सकता है।

तुम भी तो चुन सकते हैं जो इन तरीकों में से विस्तार तरीकों (# 3.0 ग के बाद से) के रूप में संपर्क में हैं:

public static class StringUtil 
{ 
    public static string RemoveFirstLine(this string multiLineString) 
    { 
     // ... 
    } 
} 
0

मैं ऐसे कार्यों के लिए एक स्थिर कार्यकर्ता वर्ग बनाउंगा। शायद नहीं सबसे अच्छा तरीका है, लेकिन एक जो चीजों को सरल ... रहता है;)

कश्मीर

0

उपयोग एक स्ट्रिंग के लिए एक extension method। यही वह है जो वे हैं।

+0

डैन ने जोड़ा जब मैं अपना जवाब लिख रहा था !! –

1

मैंने स्थिर "सहायक" कक्षाएं की हैं लेकिन कुछ विश्लेषण के बाद; इस प्रकार का सहायक कार्य हमेशा एक विशिष्ट वर्ग कार्यान्वयन के रूप में समाप्त होता है। आपके मामले में आपके पास "मूल पाठ पार्सर" वर्ग और एक व्युत्पन्न कक्षा होगी जो "पार्स" विधि को ओवरराइड करती है।

0

आप स्थिर विधियों वाले वर्ग का उपयोग कर सकते हैं। कुछ ParserUtils.RemoveFirstLine() की तरह। .NET 3.5 और उसके बाद आप कभी-कभी विस्तार विधियों का उपयोग कर सकते हैं जब आपके उपयोगिता फ़ंक्शन उस कक्षा से संबंधित होते हैं जिसे आप संशोधित नहीं कर सकते, जैसे स्ट्रिंग क्लास। Intellisense परियोजना में किसी भी स्ट्रिंग ऑब्जेक्ट पर विस्तार विधि दिखाएगा।

6

सावधान रहें!

  • क्रॉस काटने वाले सामान्य उपयोगिता कार्यों को उच्च उपयोगिता नामस्थान में रहना चाहिए। स्ट्रिंग पार्सिंग, फाइल मैनिपुलेशन, आदि

  • एक्सटेंशन ऑब्जेक्ट्स को अपने नामस्थान में रहना चाहिए।

  • उपयोगिता कार्य जो व्यावसायिक वस्तुओं या विधियों के निर्दिष्ट सेट पर लागू होते हैं, उन वस्तुओं के नामस्थान के भीतर रहना चाहिए। अक्सर एक सहायक प्रत्यय, यानी BusinessObjectHelper के साथ। नामकरण यहां महत्वपूर्ण है। क्या आप विविध तरीकों के लिए एक कंटेनर बना रहे हैं, या क्या उन्हें विशेष वस्तुओं, यानी एक पार्सर में समूहित करने के लिए और अधिक समझदारी होगी?

3

यदि आप सी # 3.0 का उपयोग कर रहे हैं, तो आप एक विस्तार विधि का उपयोग करने पर विचार करना चाहेंगे!

public static class StringExtensions 
{ 
    public static string RemoveFirstLine(this string myString) 
    { 
     return myString.Remove("line..!"); 
    } 
} 

तब कोड में आप यह कर सकते हैं:

string myString = "Hello World etc"; 

string removedLineString = myString.RemoveFirstLine(); 
+1

मैं आमतौर पर विस्तार विधियों से नफरत करता हूं। उन्होंने कार्यक्षमता के वर्ग और पुस्तकालय encapsulation तोड़ दिया। मैं .NET लाइब्रेरी को "ठीक" करने के लिए कौन हूं? अब कोई मेरे कोड myString.Whargarble() में कुछ विधि में चलाता है। वे उस विधि को कहां पाते हैं? मुझे लगता है कि myString = MyCompany.StringUtils.Whargarble (myString) क्या हो रहा है इसका एक और स्पष्ट बयान है। –

+0

एक उचित बिंदु है, यह आपके ऊपर है कि आपके कोड को कैसे कार्यान्वित करें :)। मुझे यकीन नहीं है कि एक एक्सटेंशन को एक फिक्स के रूप में माना जाता है, यह इसके विस्तार के लिए अधिक है! वे इसे क्लिक करके और F12 का चयन करके पाते हैं, और इंटेलिजेंस में छोटे आइकन द्वारा इसकी एक विस्तार विधि की पहचान करते हैं। यदि आप उन्हें एक्सटेंशन नामस्थान में जोड़ते हैं तो इसकी संभावना नहीं है; फिर आप इसका उपयोग करने के लिए "ऑप्ट-इन" की व्याख्या करते हैं। मुझे व्यक्तिगत रूप से इसके साथ कोई समस्या नहीं है। यह कैसे "कार्यक्षमता के encapsulation तोड़ने" होगा ?? यह एक विस्तार वर्ग के भीतर encapsulated! –

0

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

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