Lazy<T>を自作する

こんな感じなんだろうなーというMyLazy<T>クラスを作成してみました。

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
  class MyClass
  {
    public MyClass()
    {
      Console.WriteLine("Initialize");
    }

    public void Do()
    {
      Console.WriteLine("Do");
    }
  }

  class MyLazy<T> where T : new()
  {
    private T _value;
    public T Value
    {
      get
      {
        if (_value == null)
        {
          _value = new T();
        }
        return _value;
      }
    }
  }

  class Program
  {
    static void Main(string[] args)
    {
      var lazy = new MyLazy<MyClass>();

      Console.WriteLine("Get Instance");

      var instance = lazy.Value;

      Console.WriteLine("Method Invoke");

      instance.Do();

      // Result:
      //   Get Instance
      //   Initialize
      //   Method Invoke
      //   Do
    }
  }
}

 

やっていることは、次の通り。

  • 型引数はnew()制約をつけることでクラスに限定する。
  • getのみのValueプロパティを作成し、バッキングフィールドがnullならnewして返す。

 

なんというか、イメージは「シングルトンじゃないシングルトン」?

広告

Lazy<T>を自作する」への2件のフィードバック

  1. Nympholept (@aetos382)

    本物の Lazy には new() 制約ないですよね。
    Lazy(Func) コンストラクタもあるので。
    そうすると、内部ではリフレクション使ってるんでしょうかね。

    # Lazy(bool) コンストラクタはよくわからないので気にしない。

    返信
  2. TAKANO Sho 投稿作成者

    > 本物の Lazy には new() 制約ないですよね。
    あ、そうなんですね。そこまでは踏み込んでなかったです。

    返信

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中