我想在我的班级中使用Lazy<T>
的行为来确保某个操作只发生一次且只发生一次。我之前做过这个,通过一个Lazy本质上调用一个Func来做某事然后返回一个空值。我不关心返回值,我只是想确保只发生一次。
我认为它可以被称为Once
。我自己构建它并在内部使用Lazy
如果它还不存在,但我想在做之前先问一下。谢谢!
答案 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是创建一个任务,你不需要执行异步,你只需要等待它完成,如果它完成了,方法就直接进行。
所有方式都非常相似,请随意选择适合您解决方案的方式。