进行以下比较之间有什么区别(在正确性和性能方面)。
int a = 100;
string b = "100";
if (a == Convert.ToInt16(b))
//Do something
if (a.ToString() == b)
//Do Something
如果我有一个始终为int的字符串值(比如在网页的隐藏字段中存储int),我总是将这两个值作为整数进行比较,因为这是数据所代表的,但我想要一个更多技术原因。
答案 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)
比较字符串实际上做的是它逐字符地比较。但是比较一下比较比较快的比特。