什么是Initialize方法,我真的需要一个吗?

时间:2011-12-13 11:39:21

标签: c# constructor initialization

我对构造函数中通常使用Initialize方法的内容感到有点困惑。

为什么我不能把所有内容放在构造函数中,为什么下面的示例调用initialize方法?

    private IAzureTable<Product> _productRepository;

    public ProductService(string dataSourceID)
    {
        Initialize(dataSourceID);
    }

    private void Initialize(string dataSourceID)
    {
        this._productRepository = StorageHelper.GetTable<Product>(dataSourceID);
    }

是否有通常使用的约定?

在此示例中,我是否需要this方法中的Initialize一词?

5 个答案:

答案 0 :(得分:10)

  

为什么我不能把所有内容放在构造函数中,为什么下面的示例调用initialize方法?

您可以将它全部放在构造函数中。在这个简单的例子中,你应该。构造函数用于初始化对象。

有时你会遇到更复杂的事情:

  • 有时您会想要一个单独的Initialize方法,因为您希望在构建的单独时间调用它。
  • 有时你想要一个,因为你正在编写多个构造函数,并且你想分享它们之间的一些实现。
  • 有时候你的初始化很复杂,你想要给它们好一些名字,这样你才能知道你的代码在做什么。所以你把这些碎片分成不同的方法。

这些代码都不是这种情况,所以我只是跳过它并将代码抛出到构造函数中。

  

是否有通常使用的约定?

没有。人们做任何最容易阅读和理解的事情,无论需要编写最少的额外代码,以及任何导致代码重复最少的事情。

但是,如果您将Initialize方法公开,而不是从构造函数中调用它,我强烈建议您将其称为Initialize。设计它只需要调用一次。

  

在这个例子中,我需要“this”这个词。在Initialize方法?

没有。您永远不需要使用this来访问类成员,除非您有另一个具有相同名称的本地变量。这是一个案例:

public class Something
{
    private string someValue;

    public class Something(string someValue)
    {
        // must use "this" to access the member variable,
        // because a local variable has the same name
        this.someValue = someValue;
    }
}

答案 1 :(得分:4)

您发布的是私人帮助方法,而不是类。

它被简单地使用,因此构造函数不会被初始化代码弄得乱七八糟,以便为所做的事情提供一个好名字。

在您的具体示例中,它似乎没什么价值。

答案 2 :(得分:1)

首先,如果将功能分离到自己的方法中,代码看起来是可读的。

其次,有时在某些情况下,您希望将initialize设为public,以便开发人员可以在调用构造函数后使用它,因为您不希望代码在构造函数中运行。如果您有一个表单并且希望在显示表单之前运行一些初始化代码等,则通常就是这种情况。

答案 3 :(得分:1)

1:使用初始化方法可能有两个方面:

  • 可能有各种初始化操作需要分解为可管理的块(即构造函数可以继续执行其他操作)
  • 可能需要类重新初始化,在这种情况下,初始化代码必须位于构造函数以外的方法中。

在你的具体例子中虽然意义不大。

2:如果是this

再次在你的例子中它的意义不大。它可以在基类和当前类的属性或方法的实现之间使用无关紧要(即,您使用base.而不是this.

答案 4 :(得分:1)

没有达成一致的标准,但“Initialize”是一个众所周知的词,任何读取代码的人都可以立即识别出来,并告诉我所有关于该方法目的的知识。它可以被称为Bob(),但这没那么有用!

  

为什么我不能把所有东西放在构造函数中?

您可以,但将其分解为方法有助于提高可读性。当你的构造函数是一行代码时,它并不是必需的。

  

在这个例子中,我需要“this”这个词。在Initialize方法?

在你发布的代码中没有,没有必要。为什么会这样?可以通过工具自动生成,可能只是某人使用的约定或风格,可能是从需要它的其他地方粘贴的......