2012-02-29 55 views
1

很多次我都看到代码,他们写这样一个类:定义属性的类内

public class Detail 
{ 
    public Detail() 
    { 
     this.ColumnCtrl = new List<UserControl>(); 
    } 
    public List<UserControl> ColumnCtrl { get; set; } 
} 

但如果我只写了下面的 - 它的工作原理也很精致:

public class Detail 
{ 
    public List<UserControl> ColumnCtrl { get; set; } 
} 

是否有任何理由像第一个例子那样编写我的get-set类?

回答

0

第一个示例将ColumnCtrl属性初始化为构造Detail类时的值,其中第二个属性将保留为null。如果它没有在其他地方初始化,你应该期望NullReferenceException s。

只要您在使用第二个示例时明确初始化ColumnCtrl属性,它们就是完全相同的东西。

Detail newDetail = new Detail(); 
newDetail.ColumnCtrl = new List<UserControl>(); 
newDetail.ColumnCtrl.Add(new UserControl()); 

一种替代(尽管稍微更详细)。将懒惰地实例化ColumnCtrl属性消除实例化它的开销时Detail构造:

public class Detail 
{ 
    public Detail() 
    { 
     this.ColumnCtrl = new List<UserControl>(); 
    } 
    private List<UserControl> columnCtrl = null; 
    public List<UserControl> ColumnCtrl 
    { 
     get 
     { 
      // Missing appropriate locking mechanisms for brevity 
      if (columnCtrl == null) 
       columnCtrl = new List<UserControl>(); 

      return columnCtrl; 
     } 
     // The set is not absolutely necessary if you never need to set it 
     // from outside of Details but if you do... 
     set 
     { 
      columnCtrl = value; 
     } 
    } 
} 
+0

谢谢大家的回答。它现在使水晶感觉! – 2012-02-29 20:44:21

1

是的,因为当类被实例化时,第二个例子永远不会被初始化。

在第一个例子,下面的语句将工作:

var detail = new Detail(); 
detail.ColumnCtrl.Add(new UserControl()); 

而在第二个会,除非你使用它之前,它自己初始化一个NullReferenceException失败。

1

第二个示例不会为该属性创建新实例,如果在创建Detail实例后直接访问该实例,则会引发空引用异常。

在第一个例子中,他们确保这不会发生。

1

第一个总是确保返回List实例,因为构造函数创建了一个新实例。如果你没有这个在构造函数中它会返回一个null属性。

如果然后做:

Detail myInstance = new Detail(); 
myInstance.ColumnCtrl.Add........ //NullReferenceException is thrown here! 
0

在第二种情况下的ColumnCtrl未分配的值。在第一种情况下,确保默认为ColumnCtrl分配一个空列表。

1

是有原因的写入它的它在第一个例子中完成。这是财产的初始化。在第二种情况下,如果键入:

var detail = new Detail(); 
var count = detail.ColumnCtrl.Count 

您将得到异常,因为ColumnCtrl未初始化。

您并不总是需要初始化,例如当您使用依赖注入或者在ColumnCtrl getter中检查null并在第一次请求时初始化它时,不需要初始化。