在构造函数或类的顶部创建一个对象

在构造函数或类的顶部创建一个对象

问题描述:

哪个声明/实例化更好,为什么?在构造函数或类的顶部创建一个对象

public class MainWindow 
{ 
    private Test _test; 

    public MainWindow() 
    { 
     _test = new Test(); 
    } 
} 

OR

public class MainWindow 
{ 
    private Test _test = new Test(); 

    public MainWindow() 
    { 

    } 
} 
+1

重复的一个.... 请参阅http://*.com/questions/298183/c-member-variable-initialization-best-practice – Tony 2010-11-18 21:31:49

问自己这个问题:将其他构造函数添加到MainWindow时会发生什么?你是否想记住引用其他构造函数以确保_test被正确初始化?或者如果_test不使用另一个构造函数进行初始化?

个人在创建UI组件时,我会将尽可能多的失败点移出构造函数,并且我会将其移动到Loaded事件处理函数中,或者像在选项2中那样保留它。

后者,因为声明和初始化发生在同一行......更易于阅读,很难犯了一个错误。

我会去的第三个选项:

public class MainWindow 
{ 
    private Test _test; 

    public MainWindow(Test test) 
    { 
     _test = test; 
    } 
} 

通过注入的依赖使代码更容易进行单元测试。

+0

OP有'_test'作为一个成员变量该类意味着它不应该与'MainWindow'分开测试,而应该针对'MainWindow'。 IOW:IoC不适合'_test'。 – slugster 2010-11-18 21:33:44

+0

这种方式可以让你在测试中嘲笑它。 – 2010-11-18 21:34:52

+0

@slugster:这取决于Test做了什么。如果它向MainWindow提供任何类型的数据,它应该被注入。如果您可以从您的测试中提供该数据(通过存根/模拟对象),您将获得预定义(可测试)结果。 – jgauffin 2010-11-18 21:37:05

这是一样的

int i; 
... 
i = 0; 

int i = 0; 

我的看法是,初始化应该是贴近声明如果可能的话,在理想的情况下它的一部分之间的差异。除了可读性的奖励之外,您忘记初始化的机会更小。所以第二个变体是更好的。

这是更好,当你去写子类来做到这一点的构造函数中,使之平原创建对象时所发生的事情,尤其是。

通常,虽然这是一个品味的问题,最重要的是要一致在您的选择。

我不认为你可以说一个声明是优于其他的,它是所有关于你的表格的逻辑,如果你不想在表单上开始测试启动,但上的按钮点击,然后第一个声明更好。

+0

+1:懒惰的实例化可能非常有用。 – Tony 2010-11-18 21:35:33

+0

没错,如果“新测试()”涉及大量内存使用情况,只需在需要时调用,比如按钮事件或创建类型测试类时势在必行。 – 2010-11-18 21:40:46

第二个是最干净的imho。我通常只需在构造函数中创建需要用参数初始化的对象。

无参数

public class MainWindow 
{ 
    private Test _test = new Test(); 

    public MainWindow() 
    { 

    } 
} 

与参数:

public class MainWindow 
{ 
    private Test _test; 

    public MainWindow() 
    { 
     _test = new Test("abc") 
    } 
} 

由于杰克逊教皇说,它可以是一个好主意,添加一个构造函数为对象,以使其更容易开始使用DI之后。你可以阅读有关DI/IoC的位置:http://www.codeproject.com/KB/architecture/DependencyInjection.aspx

在你给,没有的要选择较好的例子。这两个代码片段在构造类时都会实例化一个成员变量。唯一真正的区别是,在第二种情况下,成员在构造函数执行前之前被初始化为

它真正有所作为的唯一时间是当成员变量需要传递给它的构造函数的信息时,Main类获取它的构造函数。然后你别无选择,只能使用第二个选项。

例如:

public class MainWindow 
{ 
    private Test _test; 

    public MainWindow(int i) 
    { 
     _test = new Test(i); 
    } 
} 

它不会有所作为可言,因为编译器生成完全相同一样IL。在可读性方面,这只是个人品味的问题。我更喜欢后者的版本,但与readonly修改:

public class MainWindow 
{ 
    private readonly Test _test = new Test(); 

    public MainWindow() 
    { 

    } 
} 

,这是特别容易阅读和维护时,班里有一个以上的构造函数。

+0

在给出的例子中它是真的,但是当MainWindow从其他类派生时,会有区别:第二种情况'Test'将在基构造函数之前构造。 – Vlad 2010-11-18 21:46:55