【问题标题】:Should I adjust the value of a property when setting it or when getting it? [closed]我应该在设置属性时还是在获取属性时调整它的值? [关闭]
【发布时间】:2018-02-09 20:17:13
【问题描述】:

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

什么是最佳实践以及以下 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); }
}

【问题讨论】:

  • 除了第一个调用NullDateForMaxOrMinDate 而第二个不调用这一事实之外,一个在setter 中进行验证,另一个在getter 中进行验证。您选择哪一个是一个见仁见智的问题(这就是我投票关闭的原因),尽管我更喜欢在 setter 中进行验证。这也是我会调用NullDateForMaxOrMinDate 的地方(在设置私有支持字段之前)。
  • 我同意关闭(意见请求)并更喜欢在 setter 中进行验证。我不会使用静默覆盖,而是使用异常作为对有故障的 SodaDateTIme 的反应。这是一个“不应被忽视”或默默修复的问题。 (codeproject.com/Articles/9538/…) 我也想知道整个设计:SodaDateTime 似乎是从 DateTime 派生的,并添加了 2 个字段 - 1 个字符串和对您分配的类的引用?这是怎么回事?

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


【解决方案1】:

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

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

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

X AVOID 从属性获取器中抛出异常。属性 getter 应该是简单的操作,不应该有任何前置条件。如果 getter 可以抛出异常,它可能应该重新设计为方法。


根据属性应该有一个有效的默认值和getter应该是简单操作的指导,我建议你在setter中进行验证。如果传递的值无效,则在 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));
    }
}

【讨论】:

  • 为什么 ArgumentOutOfRangeException 优于 ArgumentNullException?
  • @BlakeThingstad 这是一个很好的观点。我不熟悉SodaDateTime 类型,但如果是value == null,那么我肯定会使用ArgumentNullException。我更新了我的答案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-11-26
  • 1970-01-01
  • 2011-05-24
  • 2020-01-22
  • 2014-06-26
  • 2022-08-16
  • 2019-01-28
相关资源
最近更新 更多