QA@IT

C#でインスタンスを作成しない場合でもクラスにするべきか

5492 PV
using Hash = System.Collections.Generic.Dictionary <System.Type, PseudoDIContainer.Ctor>;
public sealed class PseudoDIContainer {
    public delegate object Ctor (object [] argv);
    private static readonly Hash theHash = new Hash ();
    static PseudoDIContainer () { }
    private PseudoDIContainer () { }

    public static T Get<T> (params object [] argv) where T : class {
        return theHash [typeof (T)] (argv) as T;
    }

    public static Ctor Inject<T> (Ctor c) where T : class {
        return theHash [typeof (T)] = c;
    }
}

このクラスはこれで完成のつもりなのですけれども、ここまで書いてちょっとこれがクラスである意義のようなものを見失ってしまっています。このクラスにはインスタンスがなく、静的メンバ変数を操作しているだけです。設計として違和感があるのですが、C#においてはこのような場合はどうすべきなのでしょうか。

回答

C#においてクラスを作らずプログラミングすること自体が出来ません。
静的メンバしかないのなら静的クラスで十分かと思います。
静的メンバしかないのならコンストラクタは不要です。

編集 履歴 (0)

C#には静的クラスがあります。静的クラスにするとインスタンスを生成することができません。ただし静的メンバーしか保持できないのでご注意ください。

静的クラスと静的クラス メンバー (C# プログラミング ガイド)
http://msdn.microsoft.com/ja-jp/library/79b3xss3(v=vs.100).aspx

編集 履歴 (1)
  • 今回やりたいことにはこれが一番近いようです。ありがとうございます。 -

クラスにすべきかどうかの前に、メンバー変数を static にすべきかどうかを検討したほうが良いと思います。
もしもメンバー変数が static で良いのならば、クラスにすべきかどうかを検討し、その上でクラスにするならば、ほかに理由がない限り static なクラスで良いと思います。
もしもメンバー変数が static で良くないのならば、メンバー変数はインスタンス変数にせざるをえず、したがってクラスにすることは必須になるでしょう。その場合は当然クラスは、非 static なクラスになります。

私は C# に限らずたいていのオブジェクト指向プログラミングをおこなう場合、よっぽど特別な状況でない限り、メンバー変数を static にする必然性はほとんどないと考えます。提示されている PseudoDIContainer がどういうクラスを担うものかは私は分かりませんが、まずはメンバー変数を static にしないほうが良い、という前提で設計されることをオススメします。

編集 履歴 (0)
ウォッチ

この質問への回答やコメントをメールでお知らせします。