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

时间:2010-11-18 21:27:38

标签: c# class constructor object instantiation

哪个声明/实例化更好,为什么?

public class MainWindow
{
   private Test _test;

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

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

   public MainWindow()
   {

   }
}

9 个答案:

答案 0 :(得分:3)

问自己这个问题:当你向MainWindow添加其他构造函数时会发生什么?您是否想要记住调用其他构造函数以确保_test被正确初始化?或者,如果使用另一个构造函数,_test是否可以初始化?

在创建UI组件时,我会尽可能多地从构造函数中移出失败点,并且我会将这样的事情移动到Loaded事件处理程序,或者像在选项中那样保留它2(它使初始化很好地定位在文件中)。

答案 1 :(得分:2)

我会选择第三种选择:

public class MainWindow
{
   private Test _test;

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

通过注入依赖项,您可以更轻松地对代码进行单元测试。

答案 2 :(得分:2)

最好在构造函数中执行它,使其明确在创建对象时发生的事情,特别是当你去编写子类时。

一般来说,虽然这是一个品味问题,但最重要的是在您的选择中一致

答案 3 :(得分:1)

这与

之间的区别相同
int i;
...
i = 0;

int i = 0;

我的意见是,如果可能的话,初始化应该接近声明,在理想情况下是它的一部分。除了可读性方面的奖励之外,您忘记初始化的机会也会更小。所以第二个变体是更好的变种。

答案 4 :(得分:1)

我认为你不能说一个声明比另一个声明更好,如果你不想在表单启动时启动Test,而是点击按钮,那就是表单的逻辑了然后第一个声明更好。

答案 5 :(得分:0)

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

答案 6 :(得分:0)

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

无参数

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

   public MainWindow()
   {

   }
}

带参数:

public class MainWindow
{
   private Test _test;

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

正如 Jackson Pope 所说,为对象添加构造函数以便以后更容易开始使用DI是一个好主意。您可以在此处阅读有关DI / IoC的信息:http://www.codeproject.com/KB/architecture/DependencyInjection.aspx

答案 7 :(得分:0)

在您给出的示例中,两个选项都不是更好。这两个片段在构造类时都会实例化一个成员变量。唯一真正的区别在于,在第二种情况下,成员在构造函数执行之前被初始化

唯一真正有所作为的是当成员变量需要传递到其构造函数中的信息时,Main类进入它的构造函数。那你别无选择,只能使用第二个选项。

例如:

public class MainWindow  
{  
   private Test _test;  

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

答案 8 :(得分:0)

它完全没有区别,因为编译器生成完全相同的IL。就可读性而言,这只是个人品味的问题。我更喜欢后一版本,但使用readonly修饰符:

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

   public MainWindow()
   {

   }
}

当类有多个构造函数时,这尤其易于阅读和维护。