在构造函数或类的顶部创建一个对象
哪个声明/实例化更好,为什么?在构造函数或类的顶部创建一个对象
public class MainWindow
{
private Test _test;
public MainWindow()
{
_test = new Test();
}
}
OR
public class MainWindow
{
private Test _test = new Test();
public MainWindow()
{
}
}
问自己这个问题:将其他构造函数添加到MainWindow
时会发生什么?你是否想记住引用其他构造函数以确保_test
被正确初始化?或者如果_test
不使用另一个构造函数进行初始化?
个人在创建UI组件时,我会将尽可能多的失败点移出构造函数,并且我会将其移动到Loaded
事件处理函数中,或者像在选项2中那样保留它。
后者,因为声明和初始化发生在同一行......更易于阅读,很难犯了一个错误。
我会去的第三个选项:
public class MainWindow
{
private Test _test;
public MainWindow(Test test)
{
_test = test;
}
}
通过注入的依赖使代码更容易进行单元测试。
这是一样的
int i;
...
i = 0;
和
int i = 0;
我的看法是,初始化应该是贴近声明如果可能的话,在理想的情况下它的一部分之间的差异。除了可读性的奖励之外,您忘记初始化的机会更小。所以第二个变体是更好的。
这是更好,当你去写子类来做到这一点的构造函数中,使之平原创建对象时所发生的事情,尤其是。
通常,虽然这是一个品味的问题,最重要的是要一致在您的选择。
我不认为你可以说一个声明是优于其他的,它是所有关于你的表格的逻辑,如果你不想在表单上开始测试启动,但上的按钮点击,然后第一个声明更好。
+1:懒惰的实例化可能非常有用。 – Tony 2010-11-18 21:35:33
没错,如果“新测试()”涉及大量内存使用情况,只需在需要时调用,比如按钮事件或创建类型测试类时势在必行。 – 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()
{
}
}
,这是特别容易阅读和维护时,班里有一个以上的构造函数。
在给出的例子中它是真的,但是当MainWindow从其他类派生时,会有区别:第二种情况'Test'将在基构造函数之前构造。 – Vlad 2010-11-18 21:46:55
重复的一个.... 请参阅http://stackoverflow.com/questions/298183/c-member-variable-initialization-best-practice – Tony 2010-11-18 21:31:49