在找到Lazy<T>
类型之前,我使用以下模式来实现全局单例:
class DataModel
{
public static XmlSerializer Serializer
{
get { return SerializerFactory.instance; }
}
static class SerializerFactory
{
internal static readonly XmlSerializer instance =
new XmlSerializer(typeof(DataModel));
}
}
此模式具有以下优点:
最近我发现很多帖子建议Lazy<T>
实现类似的单例访问模式。 Lazy<T>
(或LazyInitializer
)会为此实施带来任何好处吗?
答案 0 :(得分:9)
<强>可读性强>
这是使用Lazy<T>
实现代码时的样子:
class DataModel
{
private static readonly Lazy<XmlSerializer> lazySerializer =
new Lazy<XmlSerializer>(() => new XmlSerializer(typeof(DataModel)));
public static XmlSerializer Serializer
{
get { return lazySerializer.Value; }
}
}
Lazy<T>
's documentation就足够了),答案 1 :(得分:3)
Lazy<T>
更具表现力。很明显,该值使用延迟初始化。
例如,我在某些资源的初始化太重而无法放入构造函数的情况下使用它,并且我不希望API使用者调用一些显式的Initialize例程。