每个人都知道没有异步构造函数,好吧,至少现在还没有。该怎么办?
构造函数中已经有一个类似的问题异步代码,尽管它下面有许多无条件有用的注释,但该问题的解决方案仅针对工业规模提供 -正确和复杂。
我坐下来困惑于如何最简单安全地初始化一个直到初始化对象内部状态的异步操作结束才能使用的对象。
不符合上述条件的最明显的正面解决方案:
public class MyClass
{
private int _data;
public async Task InitAsync()
{
await Task.Delay(100);
data = 42;
}
public int GetData()
{
if (_data != 42)
throw new Exception("Объект не инициализирован, запустите InitAsync(), и дождитесь его завершения");
return _data;
}
}
即在调用worker方法时,检查对象是否初始化正确,否则抛出异常。
var instance = new MyClass();
await instance.InitAsync();
int result = instance.GetData();
InitAsync()
该解决方案是有效的,但如果开发人员忘记调用或由于其他原因未调用此方法,或者在初始化方法中发生异常,则容易出现开发错误。一般来说,有机会获得非工作副本,这很糟糕。
有没有一种简单的方法来实施一致的解决方案?没有工厂、大量接口和其他东西。
有一种方法,尽管很简单,但结果对我来说并不明显。它包括隐藏构造函数并通过静态方法创建对象。为什么我以前没有见过这个解决方案?:)
CreateAsync()
不再需要检查工作方法中初始化的正确性,因为未初始化的实例不会存在于方法之外。开发人员的工作简化为以下代码:
在我看来,这个解决方案更全面、更安全。该对象无法初始化,因此不会引用它。
GetData()
因此,不会发生非法呼叫。另外,这个类的公共 API 现在看起来更短了,这也很好。readonly
字段和get
-only 属性呢?但是像这样: