0

NHibernate プロジェクト (バージョン 3.3.1.4000) のソースを調べていたところ、AnywhereMatchModeクラスに奇妙な点があることに気付きました。

public override string ToMatchString(string pattern)
{
    return (string) (object) '%' + (object) pattern + (string) (object) '%';
}

いったいなぜ彼らは char をオブジェクトにキャストし、すぐにそれを文字列に再キャストするのでしょうか? 他の文字列に追加する前に、文字列をオブジェクトにキャストするのはなぜですか? ここにパフォーマンスのボーナスはありますか、それとも避けるべきエッジケースはありますか? 理由があるはずなので、このコードの背後にあるアイデアを探しています。

注: ReSharper の"Navigate To" 機能を使用してここにたどり着いたので、これは私が見ている逆コンパイルされたコードである可能性があります。そうだとしても、ここで何が起こっているのか知りたいです。

4

1 に答える 1

5

NHibernate のソース コードを見ると、ReSharper の "Navigate To" のアーティファクトである可能性があるように見えますが、そのメソッドは次のようになっています。

public override string ToMatchString(string pattern)
{
    return '%' + pattern + '%';
}

NHibernate ソースコード

更新: このメソッドの 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

于 2013-07-25T17:32:03.570 に答える