我正在寻找进行延迟初始化的方法并发现Lazy<T> http://msdn.microsoft.com/en-us/library/dd642331.aspx它包含在 .NET 4 中。
我正在考虑推出自己的实施Lazy<T>
对于.NET 3.5(具有更简单的多线程策略),我遇到了以下问题:
Lazy 基本上有两种类型的构造函数:
class Lazy<T> {
public Lazy(){...} // ctor #1
它使用 T 的默认构造函数来创建 T 的实例,并且
public Lazy(Func<T> func){...} // ctor #2
它让调用者决定如何创建 T 的实例。
现在问题来了:
如果我想对第一个 ctor 进行编译时检查,我将添加一个限制
class Lazy<T> where T: new() {...}
在班级层面。这将允许我使用new T()
创建一个实例;但这个限制对于第二个 ctor 来说不是必需的,更糟糕的是,它还限制了我可以使用的类型(对于那些具有默认 ctor 的类型)
如果我希望能够在第二个 ctor 中使用任何类型,我不会设置任何限制,并且在第一个 ctor 中将使用反射来确保T
确实有一个默认的ctor。然而,这种方法缺乏编译时检查,并且只有在第一个构造函数使用错误类型时才会抛出运行时异常。
我的问题是:我能两全其美吗?
理想情况下,我希望对 ctor #1 的每次使用进行编译时检查,但同时能够对没有默认 ctor 的类型使用 ctor #2。
Microsoft 的实现是如何做到这一点的? (我不容易访问 .NET 4 源代码或 dll)。
编辑:(在“Reflector-ing”MS组件之后)
我检查了参考实现,它没有进行编译时检查。
它对“默认构造函数”情况使用反射,当然,如果情况变坏,还会伴随运行时异常。