コードアクセスセキュリティとパフォーマンス

まぁ、FullTrust なアプリケーションばかり組んでいるわけですが、FullTrustだからといってチェックが行われないわけではありません。
ちゃんとポイントポイントで、1つ前のチェックポイントまでスタックが逆流します。


これ、意外にパフォーマンスに影響するんです。

public class A
{
  public A() {}
}

public class B
{
  private B() {}
}

static void Main()
{
  Activator.CreateInstance(typeof(A), true);
  Activator.CreateInstance(typeof(B), true);
}

B の生成は private メソッドの取得と呼び出しの許可が必要な特権的な呼び出しですので、こードアクセスセキュリティの問題で A と比べてかなりの時間がかかります。
これはコンストラクタの例ですが、メソッドやフィールドへのアクセスも同様です。

public class C
{
  private void xxx(object sender, EventArgs e)
  {
  }

  public static EventHandler GetHandler()
  {
    C c = new C();
    return new EventHandler(c.xxx);
  }
}

static void Main()
{
  C.GetHandler()(null, EventArgs.Empty);
}

これはちょっと違います。delegate を使ったメソッド呼び出しの権限は、delegate を作成する側でチェックされます。
この場合、xxx メソッドに対するデリゲートを作成するコンテキストでは、xxx メソッドは自由に呼び出せますから、特権は必要ありません。
このようにして作成されたデリゲートを経由したメソッド呼び出しも同様です。
このあたりは、「delegate によるより高度なアクセス制御」などと呼ばれることもあります。*1


private に限らず、protected や internal といった修飾であっても同様です。
Type.GetMethod(), Type.GetField(), Activator.CreateInstance() などなど、あまり利用しないものだとは思いますが、クラス階層の根っこのほうの Clone() の実装で Activator.CreateInstance() していて、派生クラスが protected なコンストラクタをもっていて、頻繁に Clone() されてパフォーマンスがすごく悪い……なんて経験をしました。

*1:delegateインスタンス管理に気を使う分、プログラムする側も大変です