struct パフォーマンス向上の罠?

前の日記 id:ladybug:20040812 に対して id:akiramei:20040821 みたいな話が進んでいますが、Unit プロパティはちょっと難です。

値型を利用すると .NETGenerics は特殊化したクラス実装を生成するため、メソッドは可能な限りインライン展開されるし、対象となった値型に応じた最適化もガンガンかかります。
しかし、値型に対する操作そのものが変化するわけではないので、明示的にインターフェスを取得してしまうと、そこで値型はボックス化されてインターフェス参照が作成され、そしてインターフェスに用意されたメソッドポインタリストをたどったメソッド呼び出しが発生します。

パフォーマンスを気にするならば、値型をインターフェス参照型に変換してはいけません。
当然、インターフェスを明示的に実装してもいけません。

public Interface ICanAdd
{
  void Add(int value);
}

public struct MyInt32 : ICanAdd
{
  public int currentValue;

  public MyInt32(int initValue)
  {
    currentValue = initValue;
  }

  public void Add(int value)
  {
    currentValue += value;
  }
}

void test()
{
  MyInt32 i = new MyInt32(0);
  Console.WriteLine(i.currentValue); // output: "0"

  i.Add(1);
  Console.WriteLine(i.currentValue); // output: "1"

  (i as ICanAdd).Add(1);
  Console.WriteLine(i.currentValue); // output: "1"
}