इंट को ऑब्जेक्ट डालने का बेहतर तरीका


179

यह शायद तुच्छ है, लेकिन मैं इसे करने के लिए एक बेहतर तरीका नहीं सोच सकता। मेरे पास एक COM ऑब्जेक्ट है जो एक वैरिएंट लौटाता है जो C # में एक ऑब्जेक्ट बन जाता है। एकमात्र तरीका मैं इसे इंट में प्राप्त कर सकता हूं

int test = int.Parse(string.Format("{0}", myobject))

क्या ऐसा करने के लिए एक क्लीनर तरीका है? धन्यवाद

जवाबों:


362

आपके पास कई विकल्प हैं:

  • (int)- कास्ट ऑपरेटर। कार्य करता है यदि ऑब्जेक्ट पहले से ही वंशानुक्रम पदानुक्रम में कुछ स्तर पर पूर्णांक है या यदि कोई अंतर्निहित रूपांतरण परिभाषित है।

  • int.Parse()/int.TryParse() - अज्ञात प्रारूप की एक स्ट्रिंग से परिवर्तित करने के लिए।

  • int.ParseExact()/int.TryParseExact() - एक विशिष्ट प्रारूप में एक स्ट्रिंग से परिवर्तित करने के लिए

  • Convert.ToInt32() - अज्ञात प्रकार की वस्तु को परिवर्तित करने के लिए। यह एक स्पष्ट और अंतर्निहित रूपांतरण या IConvertible कार्यान्वयन का उपयोग करेगा यदि कोई परिभाषित किया गया है।

  • as int?- ध्यान दें "?"। asऑपरेटर संदर्भ प्रकार के लिए ही है, और इसलिए मैं प्रयोग किया जाता है "?" सूचित करना Nullable<int>। " as" ऑपरेटर की तरह काम करता है Convert.To____(), लेकिन TryParse()इसके बजाय सोचें Parse(): nullयदि रूपांतरण विफल हो जाता है तो यह अपवाद को फेंकने के बजाय वापस लौटता है।

इनमें से, मैं पसंद करूंगा (int)कि क्या वस्तु वास्तव में एक बॉक्सिंग पूर्णांक है। अन्यथा Convert.ToInt32()इस मामले में उपयोग करें।

ध्यान दें कि यह एक बहुत ही सामान्य उत्तर है: मैं डैरेन क्लार्क की प्रतिक्रिया पर कुछ ध्यान आकर्षित करना चाहता हूं क्योंकि मुझे लगता है कि यह यहाँ बारीकियों को संबोधित करते हुए एक अच्छा काम करता है, लेकिन देर से आया और अभी तक वोट नहीं किया गया है। उसे मेरा वोट "स्वीकृत उत्तर" के लिए मिलता है, वैसे भी, (int) की सिफारिश करने के लिए, यह इंगित करने के लिए कि यदि यह विफल (int)(short)हो सकता है इसके बजाय, और अनुशंसा करने के लिए आप वास्तविक रनटाइम प्रकार का पता लगाने के लिए अपने डिबगर की जांच करें।


मुझे एक ऐसा बिंदु मिला, जो वास्तव में एक त्रुटि नहीं थी, लेकिन शायद चीजों को बहुत सरल बना दिया ताकि कोई ऐसा सोच सके। मैंने वह वाक्य हटा दिया है और आधिकारिक दस्तावेज के लिए एक लिंक जोड़ दिया है।
जोएल कोएहॉर्न

क्या प्रत्यक्ष कास्ट एक निहित रूपांतरण के साथ काम करेगा? मैं इस धारणा के तहत था कि सख्ती से केवल अनबॉक्सिंग ही होगी, अन्य रूपांतरण नहीं।
डैरेन क्लार्क

वास्तव में प्रतिक्रिया नहीं, लेकिन इसे पढ़ें: blogs.msdn.com/ericlippert/archive/2009/03/19/…
जोएल

उत्थान यह है कि यह निश्चित रूप से केवल अनबॉक्स से अधिक करता है। अन्यथा, आप इसका इस्तेमाल एक उदाहरण के लिए एक डबल करने के लिए क्यों कर सकते हैं?
जोएल कोएहॉर्न

और कुछ अन्य चीजों को पढ़ने से मेरा निहित / स्पष्ट बैकवर्ड हो सकता है- लेकिन किसी भी तरह से मुझे लगता है कि यह बिंदु पार हो जाता है।
जोएल कोएहॉर्न

41

कलाकारों (int) myobject को सिर्फ काम करना चाहिए

यदि वह आपको एक अमान्य कास्ट अपवाद देता है, तो यह संभवतः इसलिए है क्योंकि वेरिएंट प्रकार VT_I4 नहीं है। मेरी शर्त यह है कि VT_I4 के साथ एक संस्करण को बॉक्सिंग इंट में बदल दिया जाता है, VT_I2 को बॉक्सिंग शॉर्ट में बदल दिया जाता है, आदि।

जब एक बॉक्सिंग वैल्यू टाइप पर कास्ट किया जाता है, तो इसे केवल बॉक्स वाले टाइप के लिए ही मान्य किया जाता है। दुश्मन उदाहरण, अगर लौटा हुआ संस्करण वास्तव में VT_I2 है तो (int) (short) myObjectकाम करना चाहिए।

सबसे आसान तरीका यह पता लगाना है कि लौटी हुई वस्तु का निरीक्षण करें और डीबगर में इसके प्रकार पर एक नज़र डालें। यह भी सुनिश्चित करें कि इंटरोप असेंबली में आपके पास चिह्नित मूल्य हैMarshalAs(UnmanagedType.Struct)


32

Convert.ToInt32 (MyObject);

यह उस मामले को संभालेगा जहां myobject अशक्त है और अपवाद को फेंकने के बजाय 0 पर वापस लौटें।


जब मैं इस तरह से कोशिश करता हूं तो मुझे "ToInt 'का प्रतीक नहीं मिल सकता है। यह केवल तभी काम करता है जब मैं उदाहरण का उपयोग करता हूं ToInt32
टोबियास फ़िल

हम इस विधि को कहां पा सकते हैं? क्या यह .Net फ्रेमवर्क लाइब्रेरी में है?
अमीर पूरामंद امیر مورمند

8

Int32.TryParseनिम्नानुसार उपयोग करें ।

  int test;
  bool result = Int32.TryParse(value, out test);
  if (result)
  {
     Console.WriteLine("Sucess");         
  }
  else
  {
     if (value == null) value = ""; 
     Console.WriteLine("Failure");
  }

दरअसल, पार्से ट्रायपार्स को बुलाता है और यदि ट्राइसेप्स गलत देता है तो अपवाद छोड़ देता है। इसलिए TryParse अपवाद को नहीं संभालता क्योंकि यह कभी नहीं फेंकता है।
शमूएल

अच्छी तरह से तकनीकी रूप से वे दोनों एक ही विधि NumberToInt32 कहते हैं, लेकिन केवल Parse अपवादों को फेंकता है जब यह काम नहीं करता है।
शमूएल

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

3

मैं प्रत्येक कास्टिंग तरीके में अंतर को सूचीबद्ध कर रहा हूं। एक विशेष प्रकार के कास्टिंग हैंडल क्या है और यह नहीं है?

    // object to int
    // does not handle null
    // does not handle NAN ("102art54")
    // convert value to integar
    int intObj = (int)obj;

    // handles only null or number
    int? nullableIntObj = (int?)obj; // null
    Nullable<int> nullableIntObj1 = (Nullable<int>)obj; // null

   // best way for casting from object to nullable int
   // handles null 
   // handles other datatypes gives null("sadfsdf") // result null
    int? nullableIntObj2 = obj as int?; 

    // string to int 
    // does not handle null( throws exception)
    // does not string NAN ("102art54") (throws exception)
    // converts string to int ("26236")
    // accepts string value
    int iVal3 = int.Parse("10120"); // throws exception value cannot be null;

    // handles null converts null to 0
    // does not handle NAN ("102art54") (throws exception)
    // converts obj to int ("26236")
    int val4 = Convert.ToInt32("10120"); 

    // handle null converts null to 0
    // handle NAN ("101art54") converts null to 0
    // convert string to int ("26236")
    int number;

    bool result = int.TryParse(value, out number);

    if (result)
    {
        // converted value
    }
    else
    {
        // number o/p = 0
    }


2
var intTried = Convert.ChangeType(myObject, typeof(int)) as int?;

1
मुझे यह उत्तर वास्तव में उपयोगी लगा, मैं एक बॉक्सेड बाइट को एक इंट में डालना चाह रहा था, और इसका उपयोग करके काम करने लगा Convert.ChangeType। मैं कहूंगा कि ओपी के लिए सही उत्तर नहीं हो सकता है, लेकिन यह निश्चित रूप से कुछ के लिए उपयोगी है!
फिलिप पैरा

1

वहाँ भी TryParse है

MSDN से:

private static void TryToParse(string value)
   {
      int number;
      bool result = Int32.TryParse(value, out number);
      if (result)
      {
         Console.WriteLine("Converted '{0}' to {1}.", value, number);         
      }
      else
      {
         if (value == null) value = ""; 
         Console.WriteLine("Attempted conversion of '{0}' failed.", value);
      }
   }

1

अजीब बात है, लेकिन स्वीकार किए गए उत्तर कास्ट और कन्वर्ट के बारे में गलत लगता है कि मेरे परीक्षणों से और प्रलेखन को पढ़ने से यह भी निहित या स्पष्ट ऑपरेटरों को ध्यान में नहीं रखना चाहिए।

इसलिए, यदि मेरे पास टाइप ऑब्जेक्ट का एक वैरिएबल है और "बॉक्सिंग" क्लास में कुछ निहित ऑपरेटर हैं जो परिभाषित करते हैं कि वे काम नहीं करेंगे।

एक और सरल तरीके के बजाय, लेकिन वास्तव में प्रदर्शन की लागत को गतिशील में पहले डालना है।

(Int) (गतिशील) myObject।

आप इसे वीएस के इंटरएक्टिव विंडो में आजमा सकते हैं।

public class Test
{
  public static implicit operator int(Test v)
  {
    return 12;
  }
}

(int)(object)new Test() //this will fail
Convert.ToInt32((object)new Test()) //this will fail
(int)(dynamic)(object)new Test() //this will pass

1
यह वह जगह है सच है, लेकिन निश्चित रूप से कुछ तुम अगर आप इसे एक बहुत कुछ कर रहे हैं प्रोफ़ाइल चाहेंगे है - dynamicसे मुक्त नहीं हुआ है
मार्क Gravell

@MarcGravell मैं आपसे पूरी तरह सहमत हूं, जैसा कि मैंने उत्तर में भी लिखा है।
eTomm

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