是否存在Lazy <t>的无效版本?</t>

时间:2014-03-17 14:32:07

标签: .net lazy-initialization

我想在我的班级中使用Lazy<T>的行为来确保某个操作只发生一次且只发生一次。我之前做过这个,通过一个Lazy本质上调用一个Func来做某事然后返回一个空值。我不关心返回值,我只是想确保只发生一次。

我认为它可以被称为Once。我自己构建它并在内部使用Lazy如果它还不存在,但我想在做之前先问一下。谢谢!

3 个答案:

答案 0 :(得分:7)

它还不存在。使用Lazy<object>并从工厂返回null

您可以将其封装到Once类中,就像您说的那样,但不要继承Lazy<object>,因为这会滥用继承。使用适当的封装。

你也可以使用LazyInitializer类,这是一个品味问题。

答案 1 :(得分:2)

如果在初始化时不需要对进行绝对控制,则可以使用其中一个类的静态构造函数。否则你可以使用以下内容:

您可以使用Lazy<T>LazyInitializer。以下是后者的一个例子。

private object _initializationObject;

// this is used to ensure the initialization function only runs once, even in
// multi-threaded scenarios
private bool _initialized;
private readonly object _initializationLock = new object();

private void Initialize()
{
  // run the initialization once
  LazyInitializer.EnsureInitialized(
    ref _initializationObject, ref _initialized,
    _initializationLock, InitializeImpl);
}

private object InitializeImpl()
{
  // initialization code...

  return null;
}

答案 2 :(得分:2)

如上所述,实现你想要的是很好的想法

1)使用Lazy<object>返回null ..
2)使用LazyInitializer.EnsureInitialized<T>也返回null ..
3)使用单身模式或类似的东西......

但我推荐另一种方法

使用任务初始化,您可以在此处查看更多详细信息: http://blog.stephencleary.com/2013/01/async-oop-2-constructors.html

基础知识ideia是创建一个任务,你不需要执行异步,你只需要等待它完成,如果它完成了,方法就直接进行。

所有方式都非常相似,请随意选择适合您解决方案的方式。