回答:
文字列があり、それが常に整数であることが予想される場合(たとえば、一部のWebサービスが整数を文字列形式で渡す場合)は、を使用しますInt32.Parse()
。
ユーザーから入力を収集するInt32.TryParse()
場合は、ユーザーが無効な入力を行ったときの状況をより詳細に制御できるため、通常はを使用します。
Convert.ToInt32()
引数としてオブジェクトを受け取ります。(それがどのように機能するかについてはクリスSの答えを見てください)
Convert.ToInt32()
ArgumentNullException
引数がnullの場合も同様にスローされませんInt32.Parse()
。つまり、実際には、ループ内で非常に多くの反復を行わない限り、気づくことは決してないConvert.ToInt32()
でしょうが、これはおそらくよりも少し遅いというInt32.Parse()
ことです。
ToInt32
メソッドは型のロードに対してオーバーロードを持っているので、その中System.String
には型を識別するための時間が失われることはありません。実際のコードは、null値およびint.Parse(value, CultureInfo.CurrentCulture)
その他すべてに対して0を返すだけです。
Int32.TryParse()
にConvert.ToInt32()
それは間違っているため。文字列の形式が正しくない場合、Convertは例外をスローします。
リフレクターをご覧ください。
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)コメントが言うように。
Convert.ToInt32
戻り0
場合はnull
防ぐためにint.Parse
調達からArgumentNullException
。
default(int)
組み込みの値であるため、式はコンパイル時に評価されます。式の結果は0
なので、コンパイラーはリテラルを挿入し0
ます。ILの分解ツールはこれ以上のことを知ることができないので、文字通りゼロが表示されるだけです。
そのような違いはありません。内部で
Convert.ToInt32()
呼び出すint.Parse()
引数が次の場合に1つのものConvert.ToInt32()
が返さ0
れることを除いてnull
それ以外は両方とも同じように機能します
Convert.ToInt32(string)
は、int.Parse
内部的に呼び出します。Convert.ToInt32(object)
しかし、通話((IConvertible) value).ToInt32
の場合、string
通話Convert.ToInt32(string)
...ビットが畳み込まれ...
以下のコードを試してください。
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);
}
}
違いはこれです:
Int32.Parse()
そして、Int32.TryParse()
文字列だけを変換することができます。Convert.ToInt32()
を実装する任意のクラスを使用できますIConvertible
。文字列を渡した場合、型の比較などのオーバーヘッドが増えることを除いて、それらは同等です。文字列を変換している場合TryParse()
は、おそらくより良いオプションです。
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
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を使用するとパフォーマンスに実際の影響があるかどうかを確認します。
お役に立てれば。
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 )
パラメータのタイプによって異なります。たとえば、今日、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#にその暗黙の変換があるとは思わないでしょう。
char
値がvb.netよりも少し数値が多いと見なされているため、C#にとって「警告」はそれほど重要ではないと考えています。危険なのは、暗黙的なキャストのあまりの間の知覚差の存在がありますので、vb.net、中に大きくなるだろうChar
とString
。
int.Parse
andの詳細は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
出力に差はありません。どちらも正しい整数を返します。
明確にするために、コンソールアプリケーションを開きます。コードの下にコピーして、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();
}
}
Parse()メソッドは、Convert()には使用できない数値スタイルを提供します。例えば:
int i;
bool b = int.TryParse( "123-",
System.Globalization.NumberStyles.AllowTrailingSign,
System.Globalization.CultureInfo.InvariantCulture,
out i);
末尾の記号を使用して数値を解析するため、i == -123になります。ERP
システムでは、末尾の記号が一般的です。