使用したい疑似リアルタイムデータ処理アプリケーションがあるLazyInit<double>
ため、不要な計算は行いませんが、LazyInit<T>
T をクラスに制限します。私はそれを回避することができますが、私は明らかにそうしないことを好みます.
これがなぜなのか誰か知っていますか?
使用したい疑似リアルタイムデータ処理アプリケーションがあるLazyInit<double>
ため、不要な計算は行いませんが、LazyInit<T>
T をクラスに制限します。私はそれを回避することができますが、私は明らかにそうしないことを好みます.
これがなぜなのか誰か知っていますか?
私たちの現在の (プレビュー) ビットは LazyInit 型のみを提供します。あなたが観察した (そして JaredPar が正しく診断した) ように、T を参照型に制限して、(i) LazyInit を構造体にし、(ii) を介して妥当なデフォルト動作を提供します。 CMPXCHG (つまり、値がないことを意味する「null」をチェックできます)。T を無制限にすることもできましたが、一般的なケースに合わせて最適化することにしました。信じられないかもしれませんが、これにより、一部の人々にとってこのタイプが法外に高価になった可能性があります。
最近、コースを少し変更しました。現在、T が参照型に制限されている LazyInitField 型に加えて、T が制限されていない LazyInit 型を提供する予定です。前者はほとんどの人が使用するものですが、後者はパフォーマンスを意識し、T の制限に耐えられる人に使用できます。
これで問題が解決することを願っています。乾杯、
---joe duffy、pfx 開発リーダー
その理由は、LazyInit の根底にある API の選択です。スレッドセーフな値セットを行うために Interlocked.CompareExchange を使用します。CompareExchange はジェネリックですが、クラス型のみを使用するように制限されています。したがって、LazyInit の T 値もクラスでなければなりません。
ここで実装を表示できます: LazyInit
値型が自動的に初期化され、LazyInit が null かどうかに基づいて何かを初期化する必要があるかどうかを判断するためだと思います。null 許容型を使用することで回避できます。
LazyInit<double?>