定义属性的类内
很多次我都看到代码,他们写这样一个类:定义属性的类内
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类?
第一个示例将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;
}
}
}
是的,因为当类被实例化时,第二个例子永远不会被初始化。
在第一个例子,下面的语句将工作:
var detail = new Detail();
detail.ColumnCtrl.Add(new UserControl());
而在第二个会,除非你使用它之前,它自己初始化一个NullReferenceException
失败。
第二个示例不会为该属性创建新实例,如果在创建Detail
实例后直接访问该实例,则会引发空引用异常。
在第一个例子中,他们确保这不会发生。
第一个总是确保返回List实例,因为构造函数创建了一个新实例。如果你没有这个在构造函数中它会返回一个null属性。
如果然后做:
Detail myInstance = new Detail();
myInstance.ColumnCtrl.Add........ //NullReferenceException is thrown here!
在第二种情况下的ColumnCtrl未分配的值。在第一种情况下,确保默认为ColumnCtrl分配一个空列表。
是有原因的写入它的它在第一个例子中完成。这是财产的初始化。在第二种情况下,如果键入:
var detail = new Detail();
var count = detail.ColumnCtrl.Count
您将得到异常,因为ColumnCtrl未初始化。
您并不总是需要初始化,例如当您使用依赖注入或者在ColumnCtrl getter中检查null并在第一次请求时初始化它时,不需要初始化。
谢谢大家的回答。它现在使水晶感觉! – 2012-02-29 20:44:21