【MEF】Lazy<T>クラスの実装を見る。

  • 2010.05.17 Monday
  • 20:21
JUGEMテーマ:コンピュータ

 
Managed Extensibility Framework
http://mef.codeplex.com/

ご存知のとおりMEFはCodePlexで開発が進められていたため、ヴァージョンの違いはありますが、ソースコードが公開されています。ちょっと気になるところがあれば、ソースコードをのぞくことができます。

たとえばLazy<T>クラスもそのひとつです。

Lazy<T>クラスは

Mef_Preview_9¥src¥ComponentModel¥System¥Lazy.cs

にあります。実装をみると非常にシンプルな実装になっていることがわかります。さらにシンプルにするためにスレッドセーフを実装せずにMyLazy<T>クラスを実装してみました。

using System;

namespace Art55.CommponentModel
{
    public class MyLazy<T>
    {
        public MyLazy()
            : this (Activator.CreateInstance<T>)
        {}

        public MyLazy(Func<T> valueFactory)
        {
            if (valueFactory == null)
            {
                throw new ArgumentNullException("valueFactory");
            }

            _valueFactory = valueFactory;
        }

        public T Value
        {
            get
            {
                if (!IsValueCreated)
                {
                    _value = _valueFactory.Invoke();
                    _valueFactory = null;
                    IsValueCreated = true;
                }
                return _value;
            }
        }

        public bool IsValueCreated { get; private set; }

        private T _value;
        private Func<T> _valueFactory;
    }
}

昔、初めてプロパティにアクセスしたときに、インスタンスを作成するコードを書きたくて、いろいろ考えたなーって昔のことを思い出しました。

コメント
自分の同様のクラスを作ったことがありました。
public bool IsValueCreated {
get { return _valueFactory == null; }
}
とやってしまうのですが,やっぱり意味が違うものは別の変数を用意したほうがいいんでしょうか。
  • 2010/05/17 10:07 PM
IsValueCreatedがtrueになってしまうタイミングがvalueFactoryに変数が代入されえる前とvalueFactoryにnullが代入された後の2つのケースが生まれてしまい、コンストラクタ時にIsValueCreatedを見ることができなくなってしまうので、厳密にIsValueCreatedを管理するという観点から見れば変数は分けるべきかと思います。
  • art55
  • 2010/05/18 8:35 AM
・・・コンストラクタ時に状態がどうなっているか気にする必要などない気がしてきました。

まあ、

_valueFactory == null;

これはわかりにくいかなと思うのは確かです。
  • art55
  • 2010/05/18 8:46 AM
確かに,代入される前もnullであることを忘れていました。
自分の実装だとstructだったのでなおさらですね。
  • 2010/05/18 4:30 PM
コメントする








    
この記事のトラックバックURL
トラックバック

calendar

S M T W T F S
    123
45678910
11121314151617
18192021222324
25262728293031
<< August 2019 >>

あわせて読みたい

あわせて読みたいブログパーツ

selected entries

categories

archives

recent comment

  • 【キーボード】6年前のRealForceを復活させることはできる!?その3
    art55 (05/22)
  • 【キーボード】6年前のRealForceを復活させることはできる!?その3
    分解大好き (05/18)
  • 【.NET Framework 4.5】 IListがIReadOnlyListを継承してない理由。
    art55 (02/04)
  • 【.NET Framework 4.5】 IListがIReadOnlyListを継承してない理由。
    Gen (02/04)
  • 【キーボード】RealForce が壊れて帰ってきた。
    art55 (04/29)
  • 【.NET Framework 4.5】 IListがIReadOnlyListを継承してない理由。
    art55 (02/23)
  • 【.NET Framework 4.5】 IListがIReadOnlyListを継承してない理由。
    かるあ (02/22)
  • 【C#】Dictionaryの実装・データ構造・アルゴリズムを観察する。
    art55 (01/16)
  • 【C#】Dictionaryの実装・データ構造・アルゴリズムを観察する。
    karuakun (01/16)
  • 【NetOffice】【Excel】死なないExcelプロセスをKillする。
    art55 (12/05)

recent trackback

recommend

recommend

recommend

C#プログラマのための.NETアプリケーション最適化技法 (Programmer's SELECTION)
C#プログラマのための.NETアプリケーション最適化技法 (Programmer's SELECTION) (JUGEMレビュー »)
Sasha Goldshtein,Dima Zurbalev,Ido Flatow,サシャ・ゴルドシュタイン,ディマ・ズルバレフ,イド・フラトー

recommend

ろんりと集合
ろんりと集合 (JUGEMレビュー »)
中内 伸光
とてもわかりやすいです。

recommend

recommend

シャノン・ノイマン・ディジタル世界
シャノン・ノイマン・ディジタル世界 (JUGEMレビュー »)
市川 忠男
4章がリレーショナルデータベースな内容になってます。ページ数があまりありませんが、ポイントがものすごく的確にまとまっていて、感動します。

recommend

recommend

東プレ Realforce91UBK-S 静音キーボード 静電容量無接点方式 変荷重 ブラック NG01BS
東プレ Realforce91UBK-S 静音キーボード 静電容量無接点方式 変荷重 ブラック NG01BS (JUGEMレビュー »)

テンキーレス、静音のRealForce91UBK-S。スコスコ感がたまらなく気持ちいいです。家と会社で2台持ってます。

recommend

recommend

プログラミング.NET Framework 第4版 (プログラミングシリーズ)
プログラミング.NET Framework 第4版 (プログラミングシリーズ) (JUGEMレビュー »)
Jeffrey Richter
発売予定美 2013年10月10日。.NET Frameworkとお付き合いする人のバイブルですね。

recommend

recommend

キャット・シッターの君に。
キャット・シッターの君に。 (JUGEMレビュー »)
喜多嶋 隆
私のイラストレータデビュー本です。

recommend

Essential .NET ― 共通言語ランタイムの本質
Essential .NET ― 共通言語ランタイムの本質 (JUGEMレビュー »)
ドン・ボックス,クリス・セルズ,Don Box,Chris Sells,吉松 史彰

links

profile

search this site.

others

mobile

qrcode

powered

無料ブログ作成サービス JUGEM