【问题标题】:Is it clean to create an instance of a class inside a static method of that class?在该类的静态方法中创建该类的实例是否干净?
【发布时间】:2021-06-20 04:49:35
【问题描述】:

我有一个非静态类和一个静态方法。到目前为止没有任何疑问。但我在静态方法中创建了同一类的实例。我不确定它是否会创建循环引用。我在调试模式下运行它以查看任何意外行为,但不能。但是,我想确认这一点。可以在同一个类的静态方法中创建一个类的实例吗?这是一个坏习惯吗?

public class DownloadHelper
{
    //fields, properties

    public DownloadHelper()
    {
        // some code
    }

    public async Task<bool> HttpCalls()
    {
        await Task.Delay(1000);
        return true;
    }

    public static async void GetPreparedInAdvance()
    {
        var helper = new DownloadHelper();
        var success = await helper.HttpCalls();
        // some more codes
    }
}

// Is it ok to call like this?
DownloadHelper.GetPreparedInAdvance();

// little later,
DownloadHelper.GetPreparedInAdvance();

【问题讨论】:

  • 这样做很好,但唯一要记住的是静态成员和方法使单元测试变得困难。有一个权衡。有时最好有一个类IDownloadHelperFactory factory = new DownloadHelperFactory() 来创建IDownloadHelper helper = factory.Create(); 的实例。这种抽象允许更容易的单元测试。这取决于你的情况,什么最适合你。

标签: c# class oop static-methods instantiation


【解决方案1】:

没有问题,这段代码的作用是常规的。

使用静态方法创建对象实例:

这是我所说的静态运行方法模式的变体*:

  • 它在每次调用时创建一个类的对象实例,或者如果是单例则可以是唯一的,
  • 它执行这个实例:显示一个表单,或者从网络上下载一个文件,等等,
  • 它返回一个结果,或者不是:对话框或文件的结果,等等。

使用这种模式,构造函数通常是私有的以确保一致性。


*我还没有研究标准design patterns

【讨论】:

    猜你喜欢
    • 2021-08-03
    • 1970-01-01
    • 1970-01-01
    • 2017-03-17
    • 1970-01-01
    • 2011-06-07
    • 2013-04-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多