在构造函数中初始化属性

时间:2012-06-19 08:26:30

标签: c# .net-4.0 constructor

我有一个包含很少属性的类,并且由于一些原因我必须在构造函数中初始化它们。我是这样做的

public DataBuilder(IResources Resources)
        {
            _resources = Resources;
            // pre initializing data so request load faster after the first request
            var providerList = ProviderList;
            var publisherList = PublisherList;
            var applicationsList = ApplicationList;
            var catergoriesList = CategoryList;
            var editionsList = EditionsList;
        }

但是团队负责人告诉我如何在不将它们分配给变量的情况下初始化它们。

任何想法?

1 个答案:

答案 0 :(得分:1)

很高兴知道你在每个属性中做了什么,因为如果没有这个上下文,所有这些似乎都是代码味道。

如果属性get上的数据加载足够昂贵以保证在构造函数中“预先调用”它们,那么第一个我要做的事情至少制作方法:

InitializePropertyList();
// etc

我倾向于支持方法的原因是,当后续调用中返回值可能发生变化时,或者如果调用很昂贵(在你的情况下会是这样) - 我希望属性调用很便宜。

至于他们在构造函数中,这对我来说就像是一个代码味道。似乎代码出错了。

为什么不在没有任何数据加载的情况下构造对象并公开预加载东西的方法?

class DataBuilder
{
    public DataBuilder(IResources resources)
    {
        _resources = resources;
    }

    public void PreLoadExpensiveData()
    {
        InitializeProviderList();
        // etc
    }

    private void InitializeProviderList()
    {
        // Put whatever was in get_ProviderList into here 
        // and make the property return just the field.
    }
}

我也倾向于期望对象构造便宜。如果构造函数必须做很多事情,可能会重构它,以便构造函数询问数据而不是自己获取数据。或者,使用我上面构造对象的结构很快,但是您公开了数据加载或初始化方法 - 假设这样的数据加载操作是对象的责任