Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/285.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.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# 为什么这个NHibernate代码执行一系列显式强制转换?_C#_.net_Nhibernate_Casting - Fatal编程技术网

C# 为什么这个NHibernate代码执行一系列显式强制转换?

C# 为什么这个NHibernate代码执行一系列显式强制转换?,c#,.net,nhibernate,casting,C#,.net,Nhibernate,Casting,我正在查看我的NHibernate项目(版本3.3.1.4000)的源代码,我注意到课堂上有一些奇怪的东西: 他们究竟为什么要将一个字符转换为一个对象,然后立即将其重新转换为一个字符串?为什么在将字符串添加到其他字符串之前将其强制转换为对象?这里是否有绩效奖金,或者需要避免的边缘案例?我在寻找这段代码背后的想法,因为这肯定是有原因的 注意:我刚刚意识到,我是用ReSharper的,所以这可能是我正在查看的反编译代码。即使是这样,我也想知道这里发生了什么。看起来它可能只是ReSharper“导航到

我正在查看我的NHibernate项目(版本3.3.1.4000)的源代码,我注意到课堂上有一些奇怪的东西:

他们究竟为什么要将一个字符转换为一个对象,然后立即将其重新转换为一个字符串?为什么在将字符串添加到其他字符串之前将其强制转换为对象?这里是否有绩效奖金,或者需要避免的边缘案例?我在寻找这段代码背后的想法,因为这肯定是有原因的


注意:我刚刚意识到,我是用ReSharper的,所以这可能是我正在查看的反编译代码。即使是这样,我也想知道这里发生了什么。

看起来它可能只是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反编译时,它可能将装箱表示为对
对象的强制转换看起来它可能只是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反编译时,它看起来可能将装箱表示为对
对象的强制转换,我也很怀疑,但这是否意味着所有这些转换都在MSIL中发生?知道为什么吗?更新为包含该方法的MSIL。答案很好。谢谢。我也这么怀疑,但这是否意味着所有这些转换都发生在MSIL中?知道为什么吗?更新为包含该方法的MSIL。答案很好。非常感谢。