2010-03-04 23 views
8

चूंकि सी # में फ्रीस्टैंडिंग कार्यों के लिए समर्थन की कमी है, मुझे रूपांतरण कार्यों को रखने के लिए एक जगह खोजना मुश्किल लगता है। उदाहरण के लिए, मैं एक संख्या को एक संख्या में परिवर्तित करना चाहता हूं। सी ++ में, मैं इसके लिए निम्नलिखित फ्रीस्टैंडिंग फ़ंक्शन कर दूंगा:रूपांतरण कार्यों को कहां रखा जाए?

UINT32 ConvertToUint32(const MyEnum e); 

मैं इसे सी # में कैसे कर सकता हूं? क्या मुझे फ़ंक्शन रखने के लिए एक डमी स्थिर वर्ग बनाना चाहिए, और यदि हां, तो मैं इसके लिए सार्थक नाम कैसे प्राप्त कर सकता हूं? या मैं आंशिक वर्ग कनवर्ट करना चाहिए?

कोई विचार?

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

अद्यतन: पूर्वदर्शी में, मेरा उदाहरण बहुत अच्छी तरह से चुना नहीं गया था, क्योंकि enum और int के बीच एक डिफ़ॉल्ट रूपांतरण मौजूद है।

Person ConvertToPerson(const SpecialPersonsEnum e); 
+1

MyEnum ई = (MyEnum) 3; या MyInt i = (Int) e; सी # में int और enum के बीच कनवर्ट करने के दोनों स्वीकार्य तरीके हैं।ऐसा कहा जा रहा है, मैं हमेशा अपने रूपांतरण कार्यों को उपयोगिता वर्ग में डालता हूं। – jle

+0

+1 'आंशिक वर्ग कनवर्ट' अच्छा विचार है। –

+3

यदि आप एक एनम से कक्षा के व्यक्ति में रूपांतरण चाहते हैं तो ** एक रूपांतरण ऑपरेटर ** लिखें। एक विधि के साथ गड़बड़ क्यों करें जब आप केवल एक ऑपरेटर लिख सकते हैं जो आप चाहते हैं? –

उत्तर

8

मैं के साथ जाना चाहते हैं क्या किया:

namespace ExtensionMethods 
{ 
    public static class MyExtensions 
    { 
     public static int ConvertToInt(this MyEnum e) 
     { 
      var m; 

      // ... Implementation 

      return m; 
     } 
    } 
} 

तो फिर तुम बस का उपयोग करेंगे MyEnum.ConvertToInt(); ही कई रूपांतरणों के सभी किया जा सकता है एक ही कक्षा के भीतर से। एक्सटेंशन विधियां संक्षेप में, बहुत सेक्सी हैं।


इसके अलावा, प्रकार कन्वर्टर्स के बारे में Eric's टिप्पणी मुझे googling मिला है। बहुत बढ़िया है, हालांकि मुझे यकीन नहीं है कि Enum के साथ उनका उपयोग कैसे करें, लेकिन अन्य रूपांतरणों के लिए, वे लागू करने के लिए एक सीटी के रूप में साफ हैं। यहाँ एक नज़र:

+0

धन्यवाद। –

1

मैं सिफारिश है कि आप बना सकते हैं और विधानसभा कि सभी अपने सहायक तरीकों/स्थिरांक और enums कि अन्य परियोजनाओं में इस्तेमाल किया जाएगा होते हैं: यह एक बेहतर उदाहरण होगा।

यह आपको इस असेंबली को अन्य असेंबली के साथ आसानी से शामिल करने की अनुमति देगा, जिसकी आवश्यकता है और परिपत्र संदर्भों से बचें।

9

उपरोक्त उदाहरण एक विस्तार विधि के लिए उम्मीदवार की तरह दिखता है।
यदि यह संभव नहीं है, तो मैं उन्हें एक स्थिर वर्ग में स्थिर तरीकों के रूप में परिभाषित करता हूं; मैं उन्हें सामान्य रूप से XXXHelper

+0

इस विशिष्ट मामले में एक कास्ट ठीक होगा, सामान्य मामले में मैं गिशू से सहमत हूं और "सहायक" कक्षा बनाने से पहले विस्तार विधियों का उपयोग करने का प्रयास करता हूं। कार्यक्षमता को यथासंभव रखें जहां यह संभव है (पाठ्यक्रम के एसआरपी को बनाए रखने के दौरान)। –

+0

आप सही हैं! मैंने एक्सटेंशन विधियों को गणनाओं पर काम करने की उम्मीद नहीं की थी, लेकिन स्पष्ट रूप से वे करते हैं। –

1

नामक एक स्थैतिक वर्ग में डालता हूं, क्या आप इसके लिए केवल एक कास्ट का उपयोग नहीं कर सकते? (UInt32)e। वरना फोन Convert.ToUInt32(e)

+0

हां, लेकिन मैं सामान्य मामले के बारे में बात कर रहा हूं। मेरा उदाहरण केवल स्थिति को स्पष्ट करने के लिए था। इसके लिए –

1

एक स्थिर "डमी वर्ग" बनाने के विचार क्या माइक्रोसॉफ्ट का सुझाव हो रहा है:

http://msdn.microsoft.com/en-us/library/bb383974.aspx

मैं अपने विशेष उदाहरण में लगता है कि एक आंशिक वर्ग Convert कर सबसे समझ में आता है।

0

मैं एक बार इसी तरह की समस्या का सामना करना पड़ा है और मैं इस

class Program 
{ 
    static void Main(string[] args) 
    { 
     string s = "123"; 
     int n = Convert.StringToInt(s); 
    } 
} 

class Convert 
{ 

    public static int StringToInt(string s) 
    { 
     // implementation 
    } 
    public static string IntToString(int n) 
    { 
     // implementation 
    } 
} 
+2

... आप .Net System.Convert क्लास का उपयोग क्यों करते हैं? उदाहरण के लिए – SysAdmin

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