Fract-Blog
Life

C#のprivateコンストラクターを使ったヨ

C#のprivateコンストラクターの使用例とその利点

こんにちは。今日は C#のprivateコンストラクター についての備忘録を書いてみます。

僕にとってC#は最初に触ったプログラミング言語です。
未経験で入社して、いきなり JS + CSS + C# を渡されて、コードを書きながら覚えていきました。

今回なぜprivateコンストラクターを使ったのかというと、
ちょっとしたプロジェクトで Result型 を導入したかったからです。

.NextResultType
FluentResults といったライブラリもあるんですが、
今回は勉強がてら、自分で実装してみました。


実際に書いたコード(だいたいこんな感じ)

public class Result<T>
{
    private Result(T value, bool isSuccess, string error = null)
    {
        Value = value;
        IsSuccess = isSuccess;
        Error = error;
    }
 
    public T Value { get; }
    public bool IsSuccess { get; }
    public string Error { get; }
 
    public static Result<T> Success(T value) 
        => new Result<T>(value, true);
 
    public static Result<T> Failure(string error) 
        => new Result<T>(default, false, error);
}

学んだこと

書いている途中で「あれ、コンストラクターって private にできるんだ!」とちょっと驚きました。 C#を触り始めた頃は全然意識してなかったので…。

privateコンストラクターを使うと、 「クラスのインスタンス化を制御できる」 というのがポイントですね。

上のコードだと Result<T>

  • Success()
  • Failure()

この2つの静的メソッドからしか作れないようになっています。 OOPに詳しい人にとっては当たり前かもしれないけど、自分にとっては新鮮な発見でした。

ちなみにKotlinだと companion object + private constructor で似たことができますね!(たぶん)


まとめ

まだまだ自分から「ここはprivateコンストラクターだな!」と発想するのは難しいけど、 こういう使い方があるんだと学べて良かったです。

C#面白いな〜って思えた瞬間のひとつでした。

On this page