我正在查看我的NHibernate项目的源代码(版本3.3.1.4000),我刚刚在AnywhereMatchMode类中发现了一些奇怪的东西:
public override string ToMatchString(string pattern)
{
return (string) (object) '%' + (object) pattern + (string) (object) '%';
}
为什么他们会将一个字符串转换为一个对象并立即将其重新转换为字符串?为什么在将字符串添加到其他字符串之前将其转换为对象?这里有性能奖励,还是要避免的边缘情况?我正在寻找这个代码背后的想法,因为必须有它的原因。
注意:我刚刚意识到,我来到了ReSharper的"Navigate To" feature,所以这可能是我正在看的反编译代码。即使是这样,我也想知道这里发生了什么。
答案 0 :(得分:5)
看起来它可能只是ReSharper的“导航到”的工件,查看NHibernate的源代码,该方法如下所示:
public override string ToMatchString(string pattern)
{
return '%' + pattern + '%';
}
更新:这是此方法的MSIL:
.method public hidebysig virtual instance string
ToMatchString(string pattern) cil managed
{
// Code size 26 (0x1a)
.maxstack 3
.locals init ([0] string CS$1$0000)
IL_0000: nop
IL_0001: ldc.i4.s 37
IL_0003: box [mscorlib]System.Char
IL_0008: ldarg.1
IL_0009: ldc.i4.s 37
IL_000b: box [mscorlib]System.Char
IL_0010: call string [mscorlib]System.String::Concat(object,
object,
object)
IL_0015: stloc.0
IL_0016: br.s IL_0018
IL_0018: ldloc.0
IL_0019: ret
} // end of method AnywhereMatchMode::ToMatchString
由于代码将字符串连接编译为优化的string.Concat("%", pattern, "%")
,因此当Resharper反编译时,它看起来可能将拳击表示为object
的强制转换。