int.Parse()
和Convert.ToInt32()
的主要区别是什么?- 哪个更被推荐使用?
int.Parse()
和Convert.ToInt32()
的主要区别是什么?如果你有一个字符串,而你期望它总是一个整数(比如说,如果一个Web服务以字符串格式提供给你一个整数),那么你可以使用 Int32.Parse()
。
如果你从用户收集输入的话,通常会使用 Int32.TryParse()
,因为它允许你更细致地控制当用户输入无效时的情况。
Convert.ToInt32()
接受一个对象作为参数。(请参见Chris S的答案,了解它的工作原理)
Convert.ToInt32()
也不像Int32.Parse()
那样在其参数为空时抛出ArgumentNullException。 这也意味着 Convert.ToInt32()
可能比 Int32.Parse()
稍微慢一点,但实际上,除非您在循环中执行大量迭代,否则您永远不会注意到这一点。
看一下反射器:
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的评论)中所说。
null
,Convert.ToInt32
会返回0
,以避免int.Parse
引发ArgumentNullException
。 - André Leriadefault(int)
在编译时求值,因为它是一个内在的值 - 表达式的结果是 0
,所以编译器插入了字面量 0
。IL 反汇编工具并不知道更好的方法,所以它们只会显示一个字面的零。 - antiduhdefault(int)
值的更改,全球所有的.Net代码都必须重新编译,否则没有人的程序将能够正常工作。 - antiduh没有实质性的区别。
Convert.ToInt32()
内部调用 int.Parse()
唯一不同之处是当参数是 null
时,Convert.ToInt32()
返回 0
否则两者的工作方式相同。
Convert.ToInt32(string)
在内部调用 int.Parse
。然而,Convert.ToInt32(object)
调用了 ((IConvertible)value).ToInt32
,在字符串的情况下会调用 Convert.ToInt32(string)
...有点复杂... - Timwi请尝试下面的代码.....
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 是空引用时,它会抛出 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 是空引用时,它会返回 0 而不是抛出 ArgumentNullException 异常。如果 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
这些函数中的第一个,Parse,在任何.Net开发人员中应该都很熟悉。此函数将接收一个字符串,并尝试从中提取整数,然后返回整数。如果遇到无法解析的内容,则会引发FormatException异常,或者如果数字太大则引发OverflowException异常。此外,如果传递给它一个null值,它也可能引发ArgumentException异常。
TryParse是新版本.Net 2.0框架中新增的功能,解决了原始Parse函数存在的一些问题。主要区别在于异常处理非常缓慢,因此如果TryParse无法解析字符串,则不像Parse那样抛出异常。相反,它返回一个布尔值,指示是否成功解析数字。因此,您必须将要解析的字符串和一个Int32 out参数一起传递给TryParse以填充。我们将使用分析器来检查TryParse和Parse之间在字符串可以正确解析和无法正确解析的情况下的速度差异。
Convert类包含一系列将一个基础类转换为另一个类的函数。我认为Convert.ToInt32(string)只检查空字符串(如果字符串为空,则返回零,不像Parse),然后调用Int32.Parse(string)。我将使用分析器来确认这一点,并查看使用Convert而不是Parse是否对性能产生任何实际影响。
希望这可以帮助您。
Convert.ToInt32
这个方法有19个重载或者说可以以19种不同的方式调用它。在2010版本中可能还有更多。
它会尝试从以下类型进行转换:
Object, Boolean, Char, SByte, Byte, Int16, UInt16, Int32, UInt32, Int64, UInt64, Single, Double, Decimal, String, Date
此外,它还有一些其他的方法;其中一个与数字基数有关,另外两个方法涉及到 System.IFormatProvider
而 Parse 方法只有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 )
int.Parse
和 Convert.ToInt32
的详细说明:
比如说,你有一个字符数组,char[] a=['1','2','3','4']
,想把每个元素转换成整数。
Convert.ToInt32(a[0])
会给出数字49,因为它把它当作ASCII码。
而int.Parse(a[0])
会给出正确的输出,即1。string[] b=['1','2','3','4']
,那么在这种情况下,Convert.ToInt32
和 int.Parse
在输出方面没有任何区别。两者都返回正确的整数。Convert.ToInt32允许空值,不会抛出任何错误。 Int.parse不允许空值,会抛出一个ArgumentNullException错误。
ToInt32
方法有许多类型的重载,其中包括System.String
,因此不需要浪费时间来确定类型。实际代码仅对空值返回0,并对其他所有值执行int.Parse(value, CultureInfo.CurrentCulture)
。 - Andreas Eriksson