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

4

可能是重复问题:
最佳实践:在构造函数中初始化类字段还是在声明时?

我正在使用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>();
    }
 }

现在假设有超过10个构造函数...所以我不想在所有这些构造函数中都加入_memberVar = new Dictionary<int, string>();。第一种方法有什么问题吗?谢谢。
编辑: 我意识到我可以链接这些构造函数,但这是一个相当复杂的类...一些构造函数调用基类,一些已经调用了其他构造函数等等。

将类字段在构造函数中初始化还是在声明时初始化,哪种方式更好? - M4N
4个回答

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()) { }
}

请注意,我故意没有在其余的每个构造函数中调用最广泛的构造函数,而是级联以便在默认值的意义上更改时继承行为。
至于在声明时成员初始化,如果成员不是使用构造函数的一个参数来构造的,则我倾向于在声明时进行初始化。

1
你不必初始化成员变量,但如果你这样做也无伤大雅。成员变量会自动获取它们的默认值,通常是对象的null值,以及原始类型的默认值(比如一个int0)。
至于有不同的构造函数,你并不需要在每个版本中重复成员初始化,因为你可以像调用重载方法一样从任何其他构造函数中调用一个重载的构造函数。
至于最佳实践,个人而言,我会在构造函数中初始化成员变量,因为这是我想要将我的对象“构建”为稳定状态的地方。换句话说,即使我在声明它们时已经初始化了成员变量,当构造函数被调用时,就好像我把它们重新清空了一样。

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

这段代码在提供者那里... 哈哈,是的。 - Polaris878
我会对这个建议持保留态度。在当今时代,人们把“依赖注入”应用到每个问题上,但最终某个对象负责实例化其他对象。在你的例子中,成员变量是一个Dictionary,所以我会假设它是对象图末端的叶子对象,在这种情况下,当前对象将负责创建它。 - user1342582

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接