比较字符串和int时,将它们转换为字符串与将它们转换为int之间的区别是什么?

时间:2011-07-27 15:14:21

标签: c#

进行以下比较之间有什么区别(在正确性和性能方面)。

int a = 100;
string b = "100";

if (a == Convert.ToInt16(b))
    //Do something

if (a.ToString() == b)
    //Do Something

如果我有一个始终为int的字符串值(比如在网页的隐藏字段中存储int),我总是将这两个值作为整数进行比较,因为这是数据所代表的,但我想要一个更多技术原因。

6 个答案:

答案 0 :(得分:5)

比较字符串在某种程度上适用于相等和不平等,但不适用于其他比较。

例如,a < Convert.ToInt16(b)a.ToString() < b不同。

仅凭这个原因,我个人总是喜欢比较数字而不是字符串。

答案 1 :(得分:4)

  • 如果字符串为0100,则第二个选项将错误地返回false

  • 如果字符串碰巧不包含整数(例如,攻击者修改了它),则第一个选项将抛出异常

答案 2 :(得分:1)

我赞成在int上使用ToString(),因为它是一种类型安全的转换。如果上面的变量b以某种方式获得了非数字值,则转换将导致异常。

由于其他人指出的各种原因,转换为int更准确。请确保您正在处理b不是数字的异常情况。

答案 3 :(得分:1)

转换为int会导致较小的MSIL。第一个测试导致调用convert方法,然后在虚拟机的寄存器中进行比较。在第二个例子中,转换为字符串是一个调用(ToString()),然后与相等的比较是另一个。

故事的寓意是,如果我必须做很多这样的比较,我会坚持第一种方法。

method f1(): I convert string to int
.method private hidebysig static void  f1() cil managed
{
// Code size       29 (0x1d)
.maxstack  2
.locals init ([0] int32 a,
         [1] string b)
IL_0000:  ldc.i4.s   100
IL_0002:  stloc.0
IL_0003:  ldstr      "100"
IL_0008:  stloc.1
IL_0009:  ldloc.0
IL_000a:  ldloc.1
IL_000b:  call       int16 [mscorlib]System.Convert::ToInt16(string)
IL_0010:  bne.un.s   IL_001c
IL_0012:  ldstr      "Test 1"
IL_0017:  call       void [mscorlib]System.Console::WriteLine(string)
IL_001c:  ret
} // end of method Program::f1

方法f2():我将int转换为字符串

.method private hidebysig static void  f2() cil managed
{
   // Code size       35 (0x23)
  .maxstack  2
  .locals init ([0] int32 a,
       [1] string b)
  IL_0000:  ldc.i4.s   100
  IL_0002:  stloc.0
  IL_0003:  ldstr      "100"
  IL_0008:  stloc.1
  IL_0009:  ldloca.s   a
  IL_000b:  call       instance string [mscorlib]System.Int32::ToString()
  IL_0010:  ldloc.1
  IL_0011:  call       bool [mscorlib]System.String::op_Equality(string,
                                                                 string)
  IL_0016:  brfalse.s  IL_0022
  IL_0018:  ldstr      "Test 2"
  IL_001d:  call       void [mscorlib]System.Console::WriteLine(string)
  IL_0022:  ret
} // end of method Program::f2

答案 4 :(得分:0)

技术原因?也许是因为它们最初是作为字符串存储的,所以你要确保通过int转换进行准确的比较,因为对于字符串比较,“0100”!=“100”这显然是不合需要的

答案 5 :(得分:0)

比较字符串实际上做的是它逐字符地比较。但是比较一下比较比较快的比特。