C# Auto Property - 这是 'pattern' 最佳实践吗?

标签 c# design-patterns automatic-properties

我似乎在我的代码中经常使用这种模式,我知道它不再是一个简单的自动属性:

  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/

相关文章:

c# - 如何为 Json.net 生成 json 对象的所有可能的 LINQ 字符串?

c# - 定义对象列表。通过对象中的特定字段获取

c# - 在工厂内运行时使用 Ioc 容器来确定类初始化

c# - 结构的构造函数有问题(编译器大喊我没有完全初始化结构的所有自动属性)

c# - 为什么我们需要创建类变量来获取和设置属性?

c# - 基于角色的安全性 asp.net mvc

c# - WinRT 有没有办法确定是否可以启动具有特定扩展名的文件?

design-patterns - 所有界面组合都被视为策略模式吗

c++ - 接口(interface)层次设计模式?

c# - 有没有办法使只读(不仅仅是私有(private))自动属性?