的延迟初始化版本,这是我用了很多自己的技术。这还可以帮助节省内存资源,因为它没有实例化列表对象,除非对象属性实际上在消费代码中被使用。这使用“延迟加载”技术。
此外,您列出的“延迟加载”技术不是线程安全的。如果同时发生多个呼叫,则可能会有多次呼叫将该属性设置为一个新的列表对象,从而会用新的空列表对象覆盖任何现有的列表值。为了使Get访问线程安全的,你需要使用Lock statement,就像这样:
private IList<BCSFilter> _BCSFilters;
// Create out "key" to use for locking
private object _BCSFiltersLOCK = new Object();
/// <summary>
/// Gets or sets the BCS filters.
/// </summary>
/// <value>The BCS filters.</value>
public IList<BCSFilter> BCSFilters
{
get
{
if (_BCSFilters == null)
{
// Lock the object before modifying it, so other
// simultaneous calls don't step on each other
lock(_BCSFiltersLOCK)
{
if (_BCSFilters == null)
}
_BCSFilters = new List<BCSFilter>();
}
}
}
return _BCSFilters;
}
set
{
_BCSFilters = value;
}
}
不过,如果你总是需要的清单<>对象实例化这是一个稍微简单对象的构造函数中只是创建它并改用自动属性。像下面这样:
public class MyObject
{
public MyObject()
{
BCSFilters = new List<BCSFilter>();
}
public IList<BCSFilter> BCSFilters { get; set; }
}
此外,如果您离开“设置”存取公共那么消费代码就能将该属性设置为空,可破坏其他消费代码。因此,让消费代码无法将属性值设置为Null的一种好方法是将set访问器设置为private。像这样:
public IList<BCSFilter> BCSFilters { get; private set; }
相关的技术是从属性返回一个IEnumerable对象。这将允许您随时在对象内部替换列表<>类型,并且消费代码不会受到影响。要返回IEnumerable> <>,您可以直接返回普通列表<>对象,因为它实现了IEnumerable接口。像下面这样:
public class MyObject
{
public MyObject()
{
BCSFilters = new List<BCSFilter>();
}
public IEnumerable<BCSFilter> BCSFilters { get; set; }
}
+1同意。不要在没有必要的地方添加它。 – 2009-11-24 12:11:39
感谢Chris给出了一个简明扼要的答案 – 2009-11-24 12:20:01
唯一的缺点是这个初始化不是线程安全的,另请参阅Rob Levine的回复。 (如果你把这个写入你的回复中,会很好。) – peterchen 2009-11-24 12:40:27