ইনট অবজেক্ট কাস্ট করার ভাল উপায়


179

এটি সম্ভবত তুচ্ছ, তবে এটি করার আরও ভাল উপায় আমি ভাবতে পারি না। আমার কাছে একটি সিওএম অবজেক্ট রয়েছে যা একটি বৈকল্পিক দেয় যা সি # তে একটি বস্তু হয়ে যায়। আমি এটি কোন int- তে প্রবেশ করতে পারি তার একমাত্র উপায়

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

এটি করার একটি পরিষ্কার উপায় আছে? ধন্যবাদ

উত্তর:


362

আপনার কাছে বেশ কয়েকটি বিকল্প রয়েছে:

  • (int)- কাস্ট অপারেটর। উত্তরাধিকার শ্রেণিবিন্যাসের কোনও স্তরে যদি অবজেক্টটি ইতিমধ্যে একটি পূর্ণসংখ্যা হয় বা কোনও অন্তর্নিহিত রূপান্তর সংজ্ঞায়িত হয় তবে কাজ করে।

  • int.Parse()/int.TryParse() - অজানা বিন্যাসের স্ট্রিং থেকে রূপান্তর করার জন্য।

  • int.ParseExact()/int.TryParseExact() - একটি নির্দিষ্ট বিন্যাসে স্ট্রিং থেকে রূপান্তর করার জন্য

  • Convert.ToInt32() - অজানা প্রকারের কোনও বস্তুকে রূপান্তর করার জন্য। এটি কোনও সুস্পষ্ট এবং অন্তর্নিহিত রূপান্তর বা আইকনভার্টেবল বাস্তবায়ন ব্যবহার করবে যদি কোনও সংজ্ঞায়িত হয়।

  • as int?- "?" নোট করুন asঅপারেটরটি কেবল রেফারেন্সের ধরণের জন্য এবং তাই আমি "ব্যবহার করি?" বোঝাতে a Nullable<int>। " as" অপারেটর এর মতো কাজ করে Convert.To____()তবে TryParse()তার চেয়ে চিন্তা করুন Parse(): nullরূপান্তর ব্যর্থ হলে এটি ব্যতিক্রম ছুঁড়ে ফেলার পরিবর্তে ফিরে আসে ।

এর মধ্যে, আমি পছন্দ করব (int)যদি বস্তুটি সত্যই একটি বাক্স পূর্ণসংখ্যা হয়। অন্যথায় Convert.ToInt32()এই ক্ষেত্রে ব্যবহার করুন ।

নোট করুন যে এটি একটি খুব সাধারণ উত্তর: আমি ড্যারেন ক্লার্কের প্রতিক্রিয়াটির দিকে কিছুটা মনোযোগ দিতে চাই কারণ আমার মনে হয় যে এখানে বিশেষত্বগুলিকে সম্বোধন করা ভাল কাজ করে তবে দেরিতে এসেছিল এবং এখনও ভোট হয়নি। তিনি যাইহোক যাইহোক, "স্বীকৃত উত্তর" এর জন্য আমার ভোট পান, প্রস্তাব দেওয়ার জন্যও (int), এটি ব্যর্থ হলে (int)(short)পরিবর্তে এটি কাজ করতে পারে এবং সুপারিশ করার জন্য আপনার আসল রানটাইমের ধরণটি অনুসন্ধান করতে আপনার ডিবাগারটি পরীক্ষা করে দেখুন।


আমি একটি পয়েন্ট পেয়েছি যা আসলেই ত্রুটি ছিল না তবে সম্ভবত জিনিসগুলি খুব বেশি সরল করা হয়েছে যাতে কেউ এটি ভাবতে পারে। আমি সেই বাক্যটি সরিয়েছি এবং প্রামাণ্য ডকুমেন্টেশনে একটি লিঙ্ক যুক্ত করেছি।
জোয়েল কোহোর্ন

সরাসরি castালাই অন্তর্নিহিত রূপান্তর নিয়ে কাজ করবে? আমার ধারণা ছিল যে এটি কেবল আনবক্সিংই করবে, অন্য কোনও রূপান্তর নয়।
ড্যারেন ক্লার্ক

হুবহু প্রতিক্রিয়া নয়, তবে এটি পড়ুন: ব্লগস.এমএসএনএন
জোয়েল কোহোর্ন

আপশটটি হ'ল এটি অবশ্যই আনবক্সের চেয়ে বেশি কিছু করে। অন্যথায় আপনি কেন এটি ব্যবহার করতে পারেন কোনও ডাবল কাস্ট করতে উদাহরণস্বরূপ?
জোয়েল কোহোর্ন 21

এবং কিছু অন্যান্য জিনিস পড়ার সাথে আমার পিছনে / স্পষ্টত আমার পিছনে পিছনে থাকতে পারে- তবে যেভাবেই আমি মনে করি এটি পয়েন্টটি পেয়ে যায়।
জোয়েল কোহোর্ন 21

41

Cast ালাই কাজ করা (int) myobject উচিত

যদি এটি আপনাকে একটি অবৈধ কাস্ট ব্যতিক্রম দেয় তবে এটি সম্ভবত কারণ বৈকল্পিকের ভি VII নয়। আমার বাজিটি হ'ল VT_I4 এর সাথে একটি রূপটি একটি বক্সযুক্ত ইনটেডে রূপান্তরিত হয়, ভিT_I2 একটি বাক্স সংক্ষিপ্ত আকারে ইত্যাদি is

একটি বক্সযুক্ত মান প্রকারে একটি কাস্ট করার সময় এটি বাক্সযুক্ত প্রকারে কাস্ট করা বৈধ। শত্রু উদাহরণস্বরূপ, যদি প্রত্যাবর্তিত বৈকল্পিকটি আসলে একটি VT_I2 হয় তবে (int) (short) myObjectকাজ করা উচিত।

সন্ধান করার সহজ উপায় হ'ল প্রত্যাবর্তিত অবজেক্টটি পরীক্ষা করা এবং ডিবাগারে এর ধরণটি একবার দেখুন। ইন্টারওপ অ্যাসেমব্লিতে আপনার সাথে ফেরতের মান চিহ্নিত রয়েছে তাও নিশ্চিত করুনMarshalAs(UnmanagedType.Struct)


32

Convert.ToInt32 (myobject);

এটি মায়োবজেক্টটি বাতিল হয়ে যাওয়া ক্ষেত্রে কেস পরিচালনা করবে এবং ব্যতিক্রম ছোঁড়ার পরিবর্তে 0 ফিরে আসবে।


আমি যখন এটির মতো চেষ্টা করি তখন "প্রতীক 'টু আইন্ট' সমাধান করতে পারি না" get এটি কেবলমাত্র যদি আমি উদাহরণ ব্যবহার করি তবে কাজ করেToInt32
টোবিয়াস

আমরা এই পদ্ধতিটি কোথায় খুঁজে পাব? এটি। নেট ফ্রেমওয়ার্ক লাইব্রেরিতে রয়েছে?
আমির পোড়মন্ড আমির পোর্টম

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");
  }

প্রকৃতপক্ষে, পার্স ট্রাই পার্সিকে কল করে এবং ট্রাইপার্স মিথ্যা বলে প্রত্যাবর্তন করলে ব্যতিক্রম ছুঁড়ে ফেলে। সুতরাং ট্রাইপার্স ব্যতিক্রমটি পরিচালনা করে না কারণ এটি কখনই ফেলে দেয় না।
স্যামুয়েল

ওয়েল টেকনিক্যালি তারা দুজনেই একই পদ্ধতিতে নাম্বারটিনট 32 নাম্বারে কল করে তবে পার্স যখন কাজ করে না তখন কেবল ব্যতিক্রম ছুঁড়ে ফেলে।
স্যামুয়েল

ট্রাইপার্সে এখনও রূপটিকে স্ট্রিংয়ে রূপান্তর করতে হবে। এএএএআইএআইকি সমস্যাটি একটি স্ট্রিং থেকে কোনও ইনটে রূপান্তরিত করে না, তবে কোনও রূপটি যা কোনও প্রকৃত প্রান্তে অন্তর্গত হয়।
ড্যারেন ক্লার্ক

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

এমএসডিএন থেকে:

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

অদ্ভুত, তবে গ্রহণযোগ্য উত্তরটি কাস্ট এবং কনভার্ট সম্পর্কে ভুল বলে মনে হচ্ছে যে আমার পরীক্ষাগুলি থেকে এবং ডকুমেন্টেশনও খুব বেশি পড়তে হবে তবে এটি জড়িত বা স্পষ্টত অপারেটরদের বিবেচনায় নেওয়া উচিত নয়।

সুতরাং, আমার কাছে যদি টাইপ অবজেক্টের ভেরিয়েবল থাকে এবং "বক্সড" শ্রেণিতে কিছু সংক্রামিত অপারেটর থাকে তবে তারা কাজ করবে না।

পরিবর্তে অন্য একটি সহজ উপায়, তবে সত্যিকারের পারফরম্যান্স ব্যয় হ'ল ডায়নামিকের আগে castালাই।

(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নিখরচায়
মার্ক গ্রাভেল

@ মার্কগ্রাভেল আমি সম্পূর্ণরূপে আপনার সাথে একমত, যেমনটি আমি উত্তরটিতেও লিখেছি।
eTomm

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.