RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1430394
Accepted
aepot
aepot
Asked:2022-07-17 05:13:44 +0000 UTC2022-07-17 05:13:44 +0000 UTC 2022-07-17 05:13:44 +0000 UTC

异步类构造函数

  • 772

每个人都知道没有异步构造函数,好吧,至少现在还没有。该怎么办?

构造函数中已经有一个类似的问题异步代码,尽管它下面有许多无条件有用的注释,但该问题的解决方案仅针对工业规模提供 -正确和复杂。

我坐下来困惑于如何最简单安全地初始化一个直到初始化对象内部状态的异步操作结束才能使用的对象。

不符合上述条件的最明显的正面解决方案:

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()该解决方案是有效的,但如果开发人员忘记调用或由于其他原因未调用此方法,或者在初始化方法中发生异常,则容易出现开发错误。一般来说,有机会获得非工作副本,这很糟糕。

有没有一种简单的方法来实施一致的解决方案?没有工厂、大量接口和其他东西。

c# async-await
  • 1 1 个回答
  • 72 Views

1 个回答

  • Voted
  1. Best Answer
    aepot
    2022-07-17T05:13:44Z2022-07-17T05:13:44Z

    有一种方法,尽管很简单,但结果对我来说并不明显。它包括隐藏构造函数并通过静态方法创建对象。为什么我以前没有见过这个解决方案?:)

    public class MyClass
    {
        private int _data;
    
        private MyClass() // прячу конструктор
        {
        }
    
        public static async Task<MyClass> CreateAsync()
        {
            var instance = new MyClass();
            await instance.InitAsync();
            return instance;
        }
    
        private async Task InitAsync()
        {
            await Task.Delay(100);
            data = 42;
        }
    
        public int GetData()
        {
            return _data;
        }
    }
    

    CreateAsync()不再需要检查工作方法中初始化的正确性,因为未初始化的实例不会存在于方法之外。

    开发人员的工作简化为以下代码:

    var instance = await MyClass.CreateAsync();
    int result = instance.GetData();
    

    在我看来,这个解决方案更全面、更安全。该对象无法初始化,因此不会引用它。GetData()因此,不会发生非法呼叫。另外,这个类的公共 API 现在看起来更短了,这也很好。

    readonly字段和get-only 属性呢?但是像这样:

    public class MyClass
    {
        private readonly int _data;
    
        private MyClass(int data)
        {
            _data = data;
        }
    
        public static async Task<MyClass> CreateAsync()
        {
            int data = await InitAsync();
            return new MyClass(data);
        }
    
        private static async Task<int> InitAsync()
        {
            await Task.Delay(100);
            return 42;
        }
    
        public int GetData()
        {
            return _data;
        }
    }
    
    • 4

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    我看不懂措辞

    • 1 个回答
  • Marko Smith

    请求的模块“del”不提供名为“default”的导出

    • 3 个回答
  • Marko Smith

    "!+tab" 在 HTML 的 vs 代码中不起作用

    • 5 个回答
  • Marko Smith

    我正在尝试解决“猜词”的问题。Python

    • 2 个回答
  • Marko Smith

    可以使用哪些命令将当前指针移动到指定的提交而不更改工作目录中的文件?

    • 1 个回答
  • Marko Smith

    Python解析野莓

    • 1 个回答
  • Marko Smith

    问题:“警告:检查最新版本的 pip 时出错。”

    • 2 个回答
  • Marko Smith

    帮助编写一个用值填充变量的循环。解决这个问题

    • 2 个回答
  • Marko Smith

    尽管依赖数组为空,但在渲染上调用了 2 次 useEffect

    • 2 个回答
  • Marko Smith

    数据不通过 Telegram.WebApp.sendData 发送

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5