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更准确。只要确保您正在处理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)-非常好。我做了一些根本无效的(草率的)假设,然后让这些假设影响我的答案。