2006-12-07

λ [.NET] IEqualityComparer

Equals, GetHashCode を定義しているインターフェース。

両方ともObjectクラスにオーバーライド可能なメソッドとして存在しているにもかかわらず、わざわざインターフェースとして2.0で定義し直しているところが面白い。 同一性ではなく値として等しい、ということを強調したかったのだろうか。

Equals しかない IEquatable の方は何であるんだろ。

λ [.NET] CollectionUtil

大文字と小文字を区別しない Hashtable または SortedList のfactory。 当初はもうちょっと増やすつもりだったのかもしれないが、これしかないと CollectionUtil の存在にたどり着くのが難しいような。

λ [.NET] BitVector32

32bitの整数をbitのかたまりとして使うためのクラス。でも普通は Flags 属性つけたenumで実装するだろ。

複数のフラグの組み合わせに対してマスク操作したいとかいう時にenumから変換して使うとかそういう感じか? そういう時に速いコードになるかどうかも含めて微妙なクラス。

λ [.NET] ICloneable

DeepCopyかShallowCopyか、インターフェース仕様で決めておいて欲しかったなあ。

とはいえShallowCopyでいいんだったら Object.MemberwiseClone があるわけで。 俺方針としては、全部DeepCopyってのは無理だとは思うけど、メンバーICloneableだったらDeepCopyする、という基準になるかな。

λ [.NET] INullable

普通 .NET 2.0 だったら Nullable<T> の方を使うんじゃないか。INullable は忘れよう。

λ [.NET] IFormattable

書式指定可能な ToString(string format, IFormatProvider formatProvider) を実装する。

書式指定コード "G" の実装は必須。一方で独自の書式指定を拡張することが可能。 DateTimeに対する yyyy-MM-dd みたいのを自分で定義したい場面は確かにあるな。 ログ出力の時に書式指定はconfigに追い出すような場面で活躍すると思われる。

λ [.NET] SynchronizationContext

同期モデルを設定するための基本機能なのだが、 SetSynchronizationContextを使ってスレッドに対する同期モデルを後から設定できるところがすごい。

λ [.NET] Interlocked

変数間の代入、変数のIncrement,Decrement をアトミックに行うためのヘルパークラス。 自分でlockすりゃいいじゃんという気もするが、Interlocked の方が速いかもしれない。

32bitシステムでは64bit値の扱いがアトミックでない、という話題が興味深い。 というかこの話はかなり気をつけていないとはまりそうだ。

EventWaitHandle クラスにこんなサンプルコードがあるな。

private static long threadCount = 0;
...
while (Interlocked.Read(ref threadCount) < 5)
    {
        Thread.Sleep(500);
    }

(追記)プログラミング .NET Framework 第2版によるとInt64の扱いは安全ではないので「使うな」と書いてある。やはり基本は自分でlockだな。

λ [.NET] Monitor

C# lock ステートメントは裏でMonitorクラスを使っている。普通は lock ステートメント。

ロックを取得出来なかった場合に別処理をする TryEnter を使うような場合に登場するクラス。 OSちっくなものを開発するんでなければあんまり使わないと思うが…

λ [.NET] Mutex, Semaphore

プロセス間でも使える同期オブジェクトを作る時に。

Mutex と Semaphore の違いがよくわからん。 ググってみた。ほほう。

Semaphoreは同時実行数を制限するような場合に使うのね。

λ [.NET] gcConcurrent 要素

ガベージコレクションの並列実行を抑制できる。 抑制した場合は自分でGCを起動するスレッドを書いて、自分でヒマそうなタイミングでキックするとかそういうことだろうか。

しかしGCの実行タイミングまで制御しなきゃいけないシビアなアプリケーションはそうそうないと思うが。 ゲームの場合はあるか。

λ [.NET] インストール時のInstallerクラスを使ったカスタム動作

Installer クラスの説明を読んでもさっぱり分からなかった。

λ [.NET] DebuggerBrowsableAttribute

デバッガ変数ウィンドウでメンバを表示するかどうか。VB.NETでは使えない

λ [.NET] DebuggerDisplayAttribute

デバッガ変数ウィンドウで表示するための書式指定

λ [.NET] DebuggerTypeProxyAttribute

デバッガ変数ウィンドウで表示するためのカスタム実装されたクラスを指定する

λ [.NET] DebuggerVisualizerAttribute

カスタムビジュアライザを指定する

λ [.NET] DebuggerHiddenAttribute, DebuggerStepThroughAttribute, DebuggerNonUserCodeAttribute

  • DebuggerHiddenAttribute : ブレークポイント設定できない
  • DebuggerStepThroughAttribute : StepIn 操作をしてても StepThrough 動作になる。ブレークポイントは設定できる 
  • DebuggerNonUserCodeAttribute : 上記二つを足したような動作

VisualStudioにより自動生成されるコードであるところの DataSet.Designer.cs みたいな奴は DebuggerNonUserCodeAttribute がついている。

λ [.NET] DebuggerStepperBoundaryAttribute

DebuggerNonUserCodeAttribute において、自動的にStepThroughなんだけどマルチスレッドの影響でそれでは困る(F5によるRunに自動的に切り替えたい)場合に利用する。

λ [.NET] ManagementEventWatcher, WqlEventQuery

WMI Explorer を見たところ、WMIのイベントは __InstanceCreationEvent, __InstancDeletionEvent ぐらいしか使い道がない感じがする。

λ [.NET] FileSystemWatcher, RenamedEventArgs

ファイルシステムの変更を監視できる。こんなもんまで用意してるのか。

λ [.NET] IsolatedStorageFile, IsolatedStorageFileStream

IsolatedStorageFile の生成については、User/Machine, Application/Assembly/Domain のかけ算計6種類のfactoryで生成する。 例: GetUserStoreForAssembly

ここでのDomainは、.NETにおけるアプリケーションドメインのこと。

多分 Documents and Settiongs/ユーザ名/Application Data の下あたりに置かれるんじゃないかと思われるが未検証。

λ 本日のカルドセプトサーガ 伝説

OmiyaSfot 祭り中。

あとは フリーザ様に学ぶカルドセプトサーガ。 やはりドラゴンボールネタは全国共通で面白い。

[]