初始化成员变量的最佳实践?

时间:2009-07-30 14:19:06

标签: c#

  

可能重复:
  Best Practice: Initialize class fields in constructor or at declaration?

我正在使用C#,但这可能适用于Java(或任何其他允许此行为的语言)...

哪种方式更可取/最佳做法?假设我总是需要_memberVar

1

class MyClass
{
    private Dictionary<int, string> _memberVar = new Dictionary<int, string>();

    public MyClass() {}
}

- 或 -

2

class MyClass
{
    private Dictionary<int, string> _memberVar = null

    public MyClass() 
    {
        _memberVar = new Dictionary<int, string>();
    }
 }

现在让我们说MyClass有超过10个构造函数......所以我不希望在所有构造函数中都有_memberVar = new Dictionary<int, string>();大声笑。第一种方式有什么问题吗?感谢

修改: 我意识到我可以链接构造函数,但这是一个相当复杂的类...一些构造函数调用基类,一些调用其他构造函数等等。

4 个答案:

答案 0 :(得分:2)

您不必初始化成员变量,但如果您这样做,则不会受到影响。成员变量自动获取其默认值,对象通常为null,基本类型的默认值(例如0的{​​{1}})。

至于具有不同的构造函数,您不必在每个版本中重复成员初始化,因为您可以像使用重载方法那样从任何其他构建函数调用重载构造函数。

关于最佳实践,个人我在构造函数中初始化成员变量,因为这是我想要将对象“构造”为稳定状态的地方。换句话说,即使我已经初始化了我声明它们的成员变量,当调用构造函数时,就好像我正在擦除平板一样。

答案 1 :(得分:1)

关于_memberVar在10个构造函数中初始化:我认为你需要重新思考你的类。这听起来过分了。如果你在每个构造函数中做同样的工作,那么你就是在违反DRY。相反,尝试采用这种结构:

public class MyClass {
    Foo _foo;
    Bar _bar;
    Baz _baz;

    public MyClass(Foo foo, Bar bar, Baz baz) {
        _foo = foo;  _bar = bar; _baz = baz;
    }

    public MyClass(Foo foo, Bar bar) : this(foo, bar, new Baz()) { }

    public MyClass(Foo foo) : this(foo, new Bar()) { }

    public MyClass() : this(new Foo()) { }
}

请注意,我故意将调用到其余每个中最广泛的构造函数中,而是级联以便在每个默认值都发生变化的情况下继承行为。

对于声明中的成员初始化,如果成员不是使用构造函数的一个参数构造的,我更喜欢在声明时初始化。

答案 2 :(得分:0)

理想情况下,您应该使用依赖注入。这意味着您将它留给类的实例化器来创建新的依赖实例并将它们注入到类的新实例中,而不是让类自己创建依赖项。

答案 3 :(得分:0)

第一种方法是我通常这样做的方式,如果所有构造函数都将它初始化为相同的值,则完全可以接受。我绝对更喜欢静态变量,以避免静态构造函数的显式声明。