int.Parse()とConvert.ToInt32の主な違いは何ですか


492
  • 主な違いは何であるint.Parse()とはConvert.ToInt32()
  • どちらを優先するか

回答:


448
  • 文字列があり、それが常に整数であることが予想される場合(たとえば、一部のWebサービスが整数を文字列形式で渡す場合)は、を使用しますInt32.Parse()

  • ユーザーから入力を収集するInt32.TryParse()場合は、ユーザーが無効な入力を行ったときの状況をより詳細に制御できるため、通常はを使用します。

  • Convert.ToInt32()引数としてオブジェクトを受け取ります。(それがどのように機能するかについてはクリスSの答えを見てください)

    Convert.ToInt32()ArgumentNullException引数がnullの場合も同様にスローされませんInt32.Parse()。つまり、実際には、ループ内で非常に多くの反復を行わない限り、気づくことは決してないConvert.ToInt32()でしょうが、これはおそらくよりも少し遅いというInt32.Parse()ことです。


54
他の人が指摘しているように、sがnullの場合、Convert.ToInt32(s)は例外をスローしませんが、Parse()はスローします。「少し遅い」というのは、違いを測定することはできないので、完全に問題の外です。
ロバートポールソン、

4
ありがとう、ロバート!完全性を高めるために、回答を編集しています。しかし、パフォーマンスに関しては、ネストされたループで呼び出すと速度の違いが検出できると思います...
Dave Markle

5
実際、このToInt32メソッドは型のロードに対してオーバーロードを持っているので、その中System.Stringには型を識別するための時間が失われることはありません。実際のコードは、null値およびint.Parse(value, CultureInfo.CurrentCulture)その他すべてに対して0を返すだけです。
Andreas Eriksson

6
@StealthRabbi:ドキュメントの「戻り値」セクション:「値の数値と同等の32ビット符号付き整数、または値がnullの場合は0(ゼロ)」
Dave Markle

3
あなたの言及を削除してくださいInt32.TryParse()Convert.ToInt32()それは間違っているため。文字列の形式が正しくない場合、Convertは例外をスローします。
デハリオン2014年

190

リフレクターをご覧ください。

int.Parse( "32"):

public static int Parse(string s)
{
    return System.Number.ParseInt32(s, NumberStyles.Integer, NumberFormatInfo.CurrentInfo);
}

これは次の呼び出しです:

internal static unsafe int ParseInt32(string s, NumberStyles style, NumberFormatInfo info)
{
    byte* stackBuffer = stackalloc byte[1 * 0x72];
    NumberBuffer number = new NumberBuffer(stackBuffer);
    int num = 0;
    StringToNumber(s, style, ref number, info, false);
    if ((style & NumberStyles.AllowHexSpecifier) != NumberStyles.None)
    {
        if (!HexNumberToInt32(ref number, ref num))
        {
            throw new OverflowException(Environment.GetResourceString("Overflow_Int32"));
        }
        return num;
    }
    if (!NumberToInt32(ref number, ref num))
    {
        throw new OverflowException(Environment.GetResourceString("Overflow_Int32"));
    }
    return num;
}

Convert.ToInt32( "32"):

public static int ToInt32(string value)
{
    if (value == null)
    {
        return 0;
    }
    return int.Parse(value, CultureInfo.CurrentCulture);
}

最初の(Dave M's)コメントが言うように。


19
以前の回答からすべての推測を削除していただきありがとうございます。
bopapa_1979

1
「return default(int);」であってはならない ?
SkorunkaFrantišek2012

2
要するに、Convert.ToInt32戻り0場合はnull防ぐためにint.Parse調達からArgumentNullException
アンドレ・Leria

4
@SkorunkaFrantišek- default(int)組み込みの値であるため、式はコンパイル時に評価されます。式の結果は0なので、コンパイラーはリテラルを挿入し0ます。ILの分解ツールはこれ以上のことを知ることができないので、文字通りゼロが表示されるだけです。
antiduh 2014年

4
@SkorunkaFrantišekこれは完全にポイントの外です。ユーザーが反映されたコードをコピーしていた。変更すると、コンパイルされたものを正しく表現できなくなります。ユーザーに元のソースがあり、元のソースにdefault(int)があった場合、それがユーザーが投稿したものです。
rshadman

78

そのような違いはありません。内部で
Convert.ToInt32()呼び出すint.Parse()

引数が次の場合に1つのものConvert.ToInt32()が返さ0れることを除いてnull

それ以外は両方とも同じように機能します


5
より正確にConvert.ToInt32(string)は、int.Parse内部的に呼び出します。Convert.ToInt32(object)しかし、通話((IConvertible) value).ToInt32の場合、string通話Convert.ToInt32(string)...ビットが畳み込まれ...
Timwi

3
ええ、Convert.ToInt32(char)は実際には(int)valueを返します。これは '1'を49に変えます。一般的に意図された機能ではありません。
Dale K

32

int.Parse(文字列s)

  • RANGEの整数>整数値を返します
  • Null値> ArguementNullException
  • 形式ではありません> FormatException
  • RANGEにない値> OverflowException

Convert.ToInt32(string s)

  • RANGEの整数>整数値を返します
  • Null値>「0」を返します
  • 形式ではありません> FormatException
  • RANGEにない値> OverflowException

bool isParsed = int.TryParse(string s、out res)

  • RANGEの整数>整数値を返すisParsed = true
  • Null値> "0"を返す、isParsed = false
  • 形式ではない>「0」を返す、isParsed = false
  • RANGEにない値> "0"を返す、isParsed = false

以下のコードを試してください。

class Program
{
    static void Main(string[] args)
    {
        string strInt = "24532";
        string strNull = null;
        string strWrongFrmt = "5.87";
        string strAboveRange = "98765432123456";
        int res;
        try
        {
            // int.Parse() - TEST
            res = int.Parse(strInt); // res = 24532
            res = int.Parse(strNull); // System.ArgumentNullException
            res = int.Parse(strWrongFrmt); // System.FormatException
            res = int.Parse(strAboveRange); // System.OverflowException

            // Convert.ToInt32(string s) - TEST
            res = Convert.ToInt32(strInt); // res = 24532
            res = Convert.ToInt32(strNull); // res = 0
            res = Convert.ToInt32(strWrongFrmt); // System.FormatException
            res = Convert.ToInt32(strAboveRange); //System.OverflowException

            // int.TryParse(string s, out res) - Test
            bool isParsed;
            isParsed = int.TryParse(strInt, out res); // isParsed = true, res = 24532
            isParsed = int.TryParse(strNull, out res); // isParsed = false, res = 0
            isParsed = int.TryParse(strWrongFrmt, out res); // isParsed = false, res = 0
            isParsed = int.TryParse(strAboveRange, out res); // isParsed = false, res = 0 
        }
        catch(Exception e)
        {
            Console.WriteLine("Check this.\n" + e.Message);
        }
    }


22

違いはこれです:

Int32.Parse()そして、Int32.TryParse()文字列だけを変換することができます。Convert.ToInt32()を実装する任意のクラスを使用できますIConvertible。文字列を渡した場合、型の比較などのオーバーヘッドが増えることを除いて、それらは同等です。文字列を変換している場合TryParse()は、おそらくより良いオプションです。


9

Int32.parse(string)--->

Int32.Parse(string s)メソッドは、数値の文字列表現を32ビットの符号付き整数に変換します。sがnull参照の場合、ArgumentNullExceptionがスローされます。sが整数値以外の場合、FormatExceptionがスローされます。sがMinValue未満またはMaxValueより大きい数値を表す場合、OverflowExceptionがスローされます。たとえば、次のとおりです。

string s1 = "1234"; 
string s2 = "1234.65"; 
string s3 = null; 
string s4 = "123456789123456789123456789123456789123456789"; 

result = Int32.Parse(s1);    //1234
result = Int32.Parse(s2);    //FormatException
result = Int32.Parse(s3);    //ArgumentNullException 
result = Int32.Parse(s4);    //OverflowException

Convert.ToInt32(string)-> Convert.ToInt32(string s)メソッドは、同等の32ビット符号付き整数の指定された文字列表現を変換します。次に、Int32.Parse()メソッドを呼び出します。sがnull参照の場合、ArgumentNullExceptionをスローするのではなく、0を返します。sが整数値以外の場合、FormatExceptionがスローされます。sがMinValue未満またはMaxValueより大きい数値を表す場合、OverflowExceptionがスローされます。

例えば:

 result = Convert.ToInt32(s1);    // 1234 
 result = Convert.ToInt32(s2);    // FormatException
 result = Convert.ToInt32(s3);    // 0
 result = Convert.ToInt32(s4);    // OverflowException 


8

TryParseの方が高速です...

これらの関数の最初のParseは、あらゆる.Net開発者に馴染みのあるものです。この関数は文字列を取得し、そこから整数を抽出して、整数を返します。解析できないものに遭遇した場合は、FormatExceptionがスローされるか、数値が大きすぎる場合はOverflowExceptionになります。また、null値を渡すと、ArgumentExceptionがスローされます。

TryParseは、元のParse関数のいくつかの問題に対処する新しい.Net 2.0フレームワークへの新しい追加です。主な違いは、例外処理が非常に遅いため、TryParseが文字列を解析できない場合、Parseのように例外をスローしません。代わりに、数値を正常に解析できたかどうかを示すブール値を返します。したがって、解析する文字列と入力するInt32出力パラメーターの両方をTryParseに渡す必要があります。文字列を正しく解析できる場合と文字列を正しく解析できる場合の両方で、プロファイラーを使用して、TryParseとParseの速度の違いを調べます。文字列を正しく解析できません。

Convertクラスには、基本クラスを別の基本クラスに変換する一連の関数が含まれています。Convert.ToInt32(string)がnull文字列をチェックするだけだと思います(文字列がnullの場合、Parseとは異なり、0を返します)だけでInt32.Parse(string)を呼び出します。プロファイラーを使用してこれを確認し、ParseではなくConvertを使用するとパフォーマンスに実際の影響があるかどうかを確認します。

例付きのソース

お役に立てれば。


3
TryParseのソースを見ると、実際には例外処理はまったく行われていません。リンクのおかげで、文字操作とビットシフトだけが行われています
Chris S

2
これらのベンチマークよると、200万を超えるオブジェクトを変換しない限り、Parse、TryParse、およびConvertはほぼ同じ速度です。
無料のコーダー24

4
Convert.ToInt32

19のオーバーロードまたは呼び出し可能な19の異なる方法があります。たぶん2010バージョンでもっと。

次のタイプからの変換を試みます。

オブジェクト、ブール、Char、SByte、Byte、Int16、UInt16、Int32、UInt32、Int64、UInt64、Single、Double、Decimal、String、Date

また、他にもいくつかの方法があります。1つは数値ベースを使用し、2つの方法はSystem.IFormatProvider

一方、解析には、4つのオーバーロードまたはメソッドを呼び出すことができる4つの異なる方法しかありません。

Integer.Parse( s As String)

Integer.Parse( s As String,  style As System.Globalization.NumberStyles )

Integer.Parse( s As String, provider As System.IFormatProvider )

Integer.Parse( s As String,  style As System.Globalization.NumberStyles, provider As System.IFormatProvider )

2

パラメータのタイプによって異なります。たとえば、今日、ASCII値を使用してcharを直接intに変換することを発見しました。私が意図した機能とは厳密には違います...

警告されました!

public static int ToInt32(char value)
{
    return (int)value;
} 

Convert.ToInt32('1'); // Returns 49
int.Parse('1'); // Returns 1

char暗黙的stringにC#に変換できますか?それは確かにVB.NETで可能であり、その言語のプログラマーはおそらく同等であるConvert.ToInt32("1"c)と期待Convert.ToInt32("1")しますが、C#にその暗黙の変換があるとは思わないでしょう。
スーパーキャット2013年

暗黙的または明示的にcharを文字列に変換することはできません。'1'.ToString()またはnew string(' 1 '、1);を呼び出す必要があります。
デールK

3
この言語ではchar値がvb.netよりも少し数値が多いと見なされているため、C#にとって「警告」はそれほど重要ではないと考えています。危険なのは、暗黙的なキャストのあまりの間の知覚差の存在がありますので、vb.net、中に大きくなるだろうCharString
スーパーキャット2013年

2

int.Parseandの詳細はConvert.ToInt32次のとおりです。たとえば、char配列があり、char[] a=['1','2','3','4']各要素を整数に変換するとします。Convert.ToInt32(a[0])あなたはそれはASCIIコードザ・として扱い49の数を与えますint.Parse(a[0])あなたは1である右の出力が得られます

あなたは文字列配列を持っている場合はstring[] b=['1','2','3','4']、その後、Convert.ToInt32そしてint.Parse出力に差はありません。どちらも正しい整数を返します。


1

Convert.ToInt32はnull値を許可し、エラーをスローしませんInt.parseはnull値を許可せず、ArgumentNullExceptionエラーをスローします。


1

明確にするために、コンソールアプリケーションを開きます。コードの下にコピーして、static void Main(string[] args)メソッドに貼り付けて ください。理解していただければ幸いです。

public  class Program
    {
        static void Main(string[] args)
        { 
            int result;
            bool status;
            string s1 = "12345";
            Console.WriteLine("input1:12345");
            string s2 = "1234.45";
            Console.WriteLine("input2:1234.45");
            string s3 = null;
            Console.WriteLine("input3:null");
            string s4 = "1234567899012345677890123456789012345667890";
            Console.WriteLine("input4:1234567899012345677890123456789012345667890");
            string s5 = string.Empty;
            Console.WriteLine("input5:String.Empty");
            Console.WriteLine();
            Console.WriteLine("--------Int.Parse Methods Outputs-------------");
            try
            {
               result = int.Parse(s1);

               Console.WriteLine("OutPut1:" + result);
            }
            catch (Exception ee)
            {
                Console.WriteLine("OutPut1:"+ee.Message);
            }
            try
            {
              result = int.Parse(s2);

              Console.WriteLine("OutPut2:" + result);
            }
            catch (Exception ee)
            {
                Console.WriteLine("OutPut2:" + ee.Message);
            }
            try
            {
               result = int.Parse(s3);

               Console.WriteLine("OutPut3:" + result);
            }
            catch (Exception ee)
            {
                Console.WriteLine("OutPut3:" + ee.Message);
            }
            try
            {
                result = int.Parse(s4);

                Console.WriteLine("OutPut4:" + result);
            }
            catch (Exception ee)
            {
                Console.WriteLine("OutPut4:" + ee.Message);
            }

            try
            {
                 result = int.Parse(s5);

                 Console.WriteLine("OutPut5:" + result);
            }
            catch (Exception ee)
            {
                Console.WriteLine("OutPut5:" + ee.Message);
            }
            Console.WriteLine();
            Console.WriteLine("--------Convert.To.Int32 Method Outputs-------------");
            try
            {

                result=  Convert.ToInt32(s1);

                Console.WriteLine("OutPut1:" + result);
            }
            catch (Exception ee)
            {
                Console.WriteLine("OutPut1:" + ee.Message);
            }
            try
            {

                result = Convert.ToInt32(s2);

                Console.WriteLine("OutPut2:" + result);
            }
            catch (Exception ee)
            {
                Console.WriteLine("OutPut2:" + ee.Message);
            }
            try
            {

         result = Convert.ToInt32(s3);

         Console.WriteLine("OutPut3:" + result);
            }
            catch (Exception ee)
            {
                Console.WriteLine("OutPut3:" + ee.Message);
            }
            try
            {

                  result = Convert.ToInt32(s4);

                  Console.WriteLine("OutPut4:" + result);
            }
            catch (Exception ee)
            {
                Console.WriteLine("OutPut4:" + ee.Message);
            }

            try
            {

                 result = Convert.ToInt32(s5);

                 Console.WriteLine("OutPut5:" + result);
            }
            catch (Exception ee)
            {
                Console.WriteLine("OutPut5:" + ee.Message);
            }

            Console.WriteLine();
            Console.WriteLine("--------TryParse Methods Outputs-------------");
            try
            {

                status = int.TryParse(s1, out result);
                Console.WriteLine("OutPut1:" + result);
            }
            catch (Exception ee)
            {
                Console.WriteLine("OutPut1:" + ee.Message);
            }
            try
            {

                status = int.TryParse(s2, out result);
                Console.WriteLine("OutPut2:" + result);
            }
            catch (Exception ee)
            {
                Console.WriteLine("OutPut2:" + ee.Message);
            }
            try
            {

                status = int.TryParse(s3, out result);
                Console.WriteLine("OutPut3:" + result);
            }
            catch (Exception ee)
            {
                Console.WriteLine("OutPut3:" + ee.Message);
            }
            try
            {

                status = int.TryParse(s4, out result);
                Console.WriteLine("OutPut4:" + result);
            }
            catch (Exception ee)
            {
                Console.WriteLine("OutPut4:" + ee.Message);
            }

            try
            {

                status = int.TryParse(s5, out result);
                Console.WriteLine("OutPut5:" + result);
            }
            catch (Exception ee)
            {
                Console.WriteLine("OutPut5:" + ee.Message);
            }


            Console.Read();
        }
    }

1

Parse()メソッドは、Convert()には使用できない数値スタイルを提供します。例えば:

int i;
bool b = int.TryParse( "123-",
           System.Globalization.NumberStyles.AllowTrailingSign,
           System.Globalization.CultureInfo.InvariantCulture,
           out i);

末尾の記号を使用して数値を解析するため、i == -123になります。ERP
システムでは、末尾の記号が一般的です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.