我应该在设置或获取属性时调整属性的值吗?

时间:2018-02-09 20:17:14

标签: c# properties getter-setter accessor read-write

大家好,请不要太苛刻。我是初学者。

b / n以下内容的最佳做法是什么,有什么区别:
#1

public SodaDateTime DteRegistered
{    
    get { return DateTimeUtil.NullDateForMaxOrMinDate(this._dteRegistered); }
    set
    {
        if (DateTimeUtil.IsNullDate(value))
        {
            this._dteRegistered = new SodaDateTime("DteRegistered", this, DateTime.Today);
        }
        else
        {
            this._dteRegistered = new SodaDateTime("DteRegistered", this, value);
        }
    }
}

VS。
#2

public SodaDateTime DteRegistered
{
    get
    {
        if (DateTimeUtil.IsNullDate(this._dteRegistered))
        { 
            _dteRegistered = new SodaDateTime("DteRegistered", this, DateTime.Today); 
        }
        return this._dteRegistered;
    }
    set { _dteRegistered = new SodaDateTime("DteRegistered", this, value); }
}

1 个答案:

答案 0 :(得分:1)

Microsoft发布了Property Design Document,其中提供了我认为适用于您的问题的以下指导:

✓DO为所有属性提供合理的默认值,确保默认值不会导致安全漏洞或代码效率极低。

✓如果属性设置器抛出异常,则DO 保留以前的值。

X避免从属性getter中抛出异常。属性getter应该是简单的操作,不应该有任何先决条件。如果getter可以抛出异常,那么它应该被重新设计为一种方法。

基于属性应该具有有效默认值并且getter应该是简单操作的指导,我建议您在setter中进行验证。如果传递的值无效,则在设置器中抛出ArgumentOutOfRangeException也是合理的,这样使用您的类的客户端就能理解正在发生的事情

// Provide reasonable default value
private SodaDateTime _dteRegistered = 
    new SodaDateTime("DteRegistered", this, DateTime.Today);

// Getter is a simple operation without preconditions
public SodaDateTime DteRegistered
{    
    get { return _dteRegistered; }
    set
    {            
        if (value == null) 
        { 
            throw new ArgumentOutOfRangeException("value cannot be null");
        }

        if (DateTimeUtil.IsNullDate(value)) 
        { 
            throw new ArgumentOutOfRangeException("value cannot have a null date"); 
            // or: value = DateTime.Today;
        }

        this._dteRegistered = DateTimeUtil.NullDateForMaxOrMinDate(
            new SodaDateTime("DteRegistered", this, value));
    }
}