PG日誌

読者です 読者をやめる 読者になる 読者になる

PG日誌

主にc#の事を書いています

C#のコンストラクタ内での処理方針

c#


「コンストラクタで例外を投げるな」という話はどこかで聞いたことがあると思います。
だからって以下のように書くと

public TheConstructor()
{
    try
    {
        // 何らかの処理
    }
    catch
    {
        // 例外が出ないように握り潰す
    }
}

例外を出さないように握り潰しはダメです。
C#の場合、メモリ管理してくれてるのでアンマネージリソースをコンストラクタ内で確保してない限り「例外を出して大丈夫」です。

むしろオブジェクトの生成が成立しなかった時は積極的に出した方がイイと思います。

ですが、そうやって安心できるからこそ問題になるのが次の例です

public TheConstructor(string address)
{
    // サーバーに接続するためのオブジェクトを生成
    this.clinet = new MyServer(address)
    {
        Port = 30005
    };
    // サーバーとの接続を確率する
    this.client.Open();
}

こうやってコンストラクタ内にアンマネージリソースを確保しちゃう処理は必要でしょうか?

このインスタンスが生成されるときの初期条件には必要ないと思います。

なので可能であれば、こんな感じに

public TheConstructor(string address, int port)
{
    this.address = address;
    this.port = port;
}

public void Open()
{
    // サーバーへの接続処理
}

として利用者がどうするか次第としておいたほうがよいかと思います。