2010-04-15T00:20:50の更新内容

programming/netfx2/System.Activator/index.wiki.txt

current previous
1,7 1,6
~
${smdncms:title,System.Activator}
${smdncms:title,型情報からインスタンスを生成する}
~
${smdncms:keywords,VB.NET,C#,Activator,CreateInstance,Type,型,動的,インスタンス}
${smdncms:keywords,VB.NET,C#,Activator,CreateInstance,Type}
~

          
${smdncms:tags,api/.net,lang/vb}
+
*型情報からインスタンスを生成する
 
Typeクラスで表された型情報とActivatorクラスのCreateInstance()メソッドを利用することで、動的にクラスのインスタンスを作成することができる。 また、このメソッドではインスタンスを生成する際に、コンストラクタに任意の引数を渡すことができる。 この方法を利用することで、動的に読み込んだアセンブリに含まれるクラスのインスタンスを作成するようなこともできる。
Typeクラスで表された型情報とActivatorクラスのCreateInstance()メソッドを利用することで、動的にクラスのインスタンスを作成することができる。 また、このメソッドではインスタンスを生成する際に、コンストラクタに任意の引数を渡すことができる。 この方法を利用することで、動的に読み込んだアセンブリに含まれるクラスのインスタンスを作成するようなこともできる。
 
#googleadunit
#googleadunit
 

        

        
119,69 118,3
 
Press any key to continue
Press any key to continue
 
}}
}}
 

        

        
+
*Activator.CreateInstanceのパフォーマンス
+
Activator.CreateInstanceによるインスタンスの作成は、コンストラクタを直接呼び出す場合と比較してパフォーマンスが悪い。 インスタンス作成にかかる時間を計測して比較すると次のようになる。
+

          
+
#prompt(.NET Framework 3.5での比較結果){{
+
               new(): 00:00:00.0065174
+
      CreateInstance: 00:00:00.1933812
+
               new(): 00:00:00.0057944
+
      CreateInstance: 00:00:00.1756506
+
               new(): 00:00:00.0064348
+
      CreateInstance: 00:00:00.1775526
+
               new(): 00:00:00.0065820
+
      CreateInstance: 00:00:00.1741865
+
               new(): 00:00:00.0057737
+
      CreateInstance: 00:00:00.1737263
+
}}
+

          
+
#prompt(Mono 2.7 r153937での比較結果){{
+
               new(): 00:00:00.0275660
+
      CreateInstance: 00:00:01.1974276
+
               new(): 00:00:00.0252957
+
      CreateInstance: 00:00:01.2043951
+
               new(): 00:00:00.0274789
+
      CreateInstance: 00:00:01.1923963
+
               new(): 00:00:00.0257264
+
      CreateInstance: 00:00:01.2036650
+
               new(): 00:00:00.0249515
+
      CreateInstance: 00:00:01.1867809
+
}}
+

          
+
#code(cs,計測に用いたコード){{
+
using System;
+
using System.Diagnostics;
+

          
+
public class Sample {
+
  public Sample() {}
+
}
+

          
+
public class Test {
+
  public static void Main()
+
  {
+
    for (var act = 0; act < 5; act++) {
+
      var sw1 = Stopwatch.StartNew();
+

          
+
      for (var i = 0; i < 1000 * 1000; i++) {
+
        new Sample();
+
      }
+

          
+
      sw1.Stop();
+

          
+
      Console.WriteLine("{0, 20}: {1}", "new()", sw1.Elapsed);
+

          
+
      var t = typeof(Sample);
+
      var sw2 = Stopwatch.StartNew();
+

          
+
      for (var i = 0; i < 1000 * 1000; i++) {
+
        Activator.CreateInstance(t);
+
      }
+

          
+
      sw2.Stop();
+

          
+
      Console.WriteLine("{0, 20}: {1}", "CreateInstance", sw2.Elapsed);
+
    }
+
  }
+
}
+
}}
+