Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 比较字符串和int时,将两者转换为字符串与将两者转换为int有什么区别?_C# - Fatal编程技术网

C# 比较字符串和int时,将两者转换为字符串与将两者转换为int有什么区别?

C# 比较字符串和int时,将两者转换为字符串与将两者转换为int有什么区别?,c#,C#,进行以下比较(在正确性和性能方面)有什么区别 int a = 100; string b = "100"; if (a == Convert.ToInt16(b)) //Do something if (a.ToString() == b) //Do Something 如果我有一个总是整数的字符串值(比如在网页上的隐藏字段中存储一个整数),我总是将这两个值作为整数进行比较,因为这是数据所表示的,但我想知道一个更技术性的原因。 如果字符串为0100,则第二个选项将错误地返回

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

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

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

if (a.ToString() == b)
    //Do Something
如果我有一个总是整数的字符串值(比如在网页上的隐藏字段中存储一个整数),我总是将这两个值作为整数进行比较,因为这是数据所表示的,但我想知道一个更技术性的原因。

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

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

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


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

技术原因?可能是因为它们最初存储为字符串,所以您可以确保通过int转换进行准确的比较,因为对于字符串比较,“0100”!=“100”显然是不受欢迎的

比较字符串实际上做的是逐字符比较。但是比较int比较更快的位。

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

例如,
a
a.ToString()
不是一回事


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

转换为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

但通常情况下,如果一个必须是数字的值有时不是数字,则需要得到一个异常。@SLaks(和Tim)-非常好。我做了一些根本无效的(草率的)假设,然后让这些假设影响我的答案。