2010-04-20T00:47:06の更新内容

programming/netfx2/index.wiki.txt

current previous
1,7 1,4
 
${smdncms:title,.NET Framework 2.0}
${smdncms:title,.NET Framework 2.0}
 
${smdncms:keywords,.NET,2.0}
${smdncms:keywords,.NET,2.0}
 
.NET Framework 2.0で新しく追加されたクラスの使い方など、.NET Framework 2.0に関すること。
.NET Framework 2.0で新しく追加されたクラスの使い方など、.NET Framework 2.0に関すること。
+

          
+
.NET Framework 2.0以降で追加された機能などは[[programming/netfx4]]へ。
+

          
 
#ls2_1
#ls2_1

programming/netfx4/System.Enum/index.wiki.txt

current previous
1,83 0,0
+
${smdncms:title,System.Enum}
+
${smdncms:keywords,System.Enum,HasFlag}
+

          
+
-関連するページ
+
--[[programming/netfx2/overview/enumtype]]
+

          
+
*HasFlagメソッド
+
Enum.HasFlagメソッドを使うことで、FlagsAttributeの付いた列挙型の値が特定のフラグを持つかどうか調べられる。 &msdn(netfx,method,System.Enum.HasFlag){HasFlagメソッドの説明};によると、このメソッドは次のビット演算と同じ結果を返すとされている。
+
#code{{
+
thisInstance And flag = flag 
+
}}
+

          
+
HasFlagsメソッドとビット演算を使った場合の記述を比較すると次のようになる。
+

          
+
#code(cs){{
+
var attrs = FileAttributes.Archive | FileAttributes.ReadOnly;
+

          
+
if (attrs.HasFlag(FileAttributes.Archive))
+
  Console.WriteLine("archive");
+

          
+
if ((attrs & FileAttributes.Archive) == FileAttributes.Archive)
+
  Console.WriteLine("archive");
+
}}
+

          
+
HasFlagメソッドを使うとコードは見やすくなる一方、ビット演算を使った場合と比べてパフォーマンスは劣化する。 速度が優先される場合や繰り返しフラグの比較を行う状況では使いにくい。
+

          
+
以下はHasFlagsメソッドとビット演算での速度を比較した結果。
+

          
+
#prompt(.NET Frameworkで実行した場合){{
+
Microsoft Windows NT 6.0.6002 Service Pack 2
+
4.0.30319.1
+

          
+
Enum.HasFlag: 00:00:14.3554873
+
bitwise 00:00:00.0125018
+
}}
+

          
+
#prompt(Mono 2.7 r153937で実行した場合){{
+
Unix 2.6.31.20
+
4.0.21006.1
+

          
+
Enum.HasFlag: 00:00:08.3252841
+
bitwise 00:00:00.0166924
+
}}
+

          
+
#code(cs,検証に使ったコード){{
+
using System;
+
using System.Diagnostics;
+
using System.IO;
+

          
+
class Test {
+
  public static void Main()
+
  {
+
    Console.WriteLine(Environment.OSVersion);
+
    Console.WriteLine(Environment.Version);
+
    Console.WriteLine();
+

          
+
    const int act = 10 * 1000 * 1000;
+
    var attrs = FileAttributes.Archive | FileAttributes.ReadOnly;
+

          
+
    var sw1 = Stopwatch.StartNew();
+

          
+
    for (var i = 0; i < act; i++) {
+
      var isArchive = attrs.HasFlag(FileAttributes.Archive);
+
      var isSystem  = attrs.HasFlag(FileAttributes.System);
+
    }
+

          
+
    sw1.Stop();
+

          
+
    Console.WriteLine("Enum.HasFlag: {0}", sw1.Elapsed);
+

          
+
    var sw2 = Stopwatch.StartNew();
+

          
+
    for (var i = 0; i < act; i++) {
+
      var isArchive = (attrs & FileAttributes.Archive) == FileAttributes.Archive;
+
      var isSystem  = (attrs & FileAttributes.System)  == FileAttributes.System;
+
    }
+

          
+
    sw2.Stop();
+

          
+
    Console.WriteLine("bitwise {0}", sw2.Elapsed);
+
  }
+
}
+
}}

programming/netfx4/index.wiki.txt

current previous
1,7 0,0
+
${smdncms:title,.NET Framework 4}
+
${smdncms:keywords,.NET,4}
+
.NET Framework 4で新しく追加されたクラス・メソッドの使い方など、.NET Framework 4に関すること。
+

          
+
.NET Framework 4以前のバージョンに関することは[[programming/netfx2]]へ。
+

          
+
#ls2_1