我似乎在我的代码中经常使用这种模式,我知道它不再是一个简单的自动属性:
public IList<BCSFilter> BCSFilters { get; set; }
我一直使用的代码是这样的:
private IList<BCSFilter> _BCSFilters;
/// <summary>
/// Gets or sets the BCS filters.
/// </summary>
/// <value>The BCS filters.</value>
public IList<BCSFilter> BCSFilters
{
get
{
if (_BCSFilters == null)
{
_BCSFilters = new List<BCSFilter>();
}
return _BCSFilters;
}
set
{
_BCSFilters = value;
}
}
这样我就可以只执行 MainClass.BCSFilters 而不必担心需要在使用代码中实例化列表。这是“正常”模式\执行此操作的正确方法吗?
我找不到重复的问题
最佳答案
这是我自己经常使用的技术。这也有助于节省内存资源,因为它不会实例化 List<> 对象,除非在使用代码中实际使用了 objects 属性。这使用了“延迟加载”技术。
此外,您列出的“延迟加载”技术不是线程安全的。如果碰巧同时对该属性进行了多次调用,您最终可能会多次调用将属性设置为新的 List<> 对象,从而用新的空 List<> 对象覆盖任何现有的 List 值。要使 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;
}
}
但是,如果您总是需要实例化 List<> 对象,那么只需在对象构造函数中创建它并改用自动属性会更简单一些。像下面这样:
public class MyObject
{
public MyObject()
{
BCSFilters = new List<BCSFilter>();
}
public IList<BCSFilter> BCSFilters { get; set; }
}
此外,如果您将“set”访问器保留为公共(public),则使用代码将能够将该属性设置为 Null,这会破坏其他使用代码。因此,防止使用代码将属性值设置为 Null 的一个好方法是将设置访问器设置为私有(private)。像这样:
public IList<BCSFilter> BCSFilters { get; private set; }
相关技术是从属性返回一个 IEnumerable<> 对象。这将允许您随时在对象内部替换 List<> 类型,并且不会影响使用代码。要返回 IEnumerable<>,您可以直接返回普通的 List<> 对象,因为它实现了 IEnumerable<> 接口(interface)。像下面这样:
public class MyObject
{
public MyObject()
{
BCSFilters = new List<BCSFilter>();
}
public IEnumerable<BCSFilter> BCSFilters { get; set; }
}
关于C# Auto Property - 这是 'pattern' 最佳实践吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1789646/