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

C# 我应该在设置或获取属性时调整属性的值吗?,c#,properties,getter-setter,accessor,read-write,C#,Properties,Getter Setter,Accessor,Read Write,大家好,请不要太苛刻。我是初学者。 最佳做法是什么?区别是什么?b/n如下所示: 一, 对2 Microsoft发布了一份报告,其中提供了我认为适用于您的问题的以下指南: ✓ 务必为所有属性提供合理的默认值,确保默认值不会导致安全漏洞或极低效率的代码 ✓ 如果属性设置程序引发异常,请保留上一个值 避免从属性获取程序引发异常。属性getter应该是简单的操作,并且不应该有任何前提条件。如果getter可以抛出异常,那么可能应该将其重新设计为方法 基于属性应该有一个有效的默认值以及getter应该是

大家好,请不要太苛刻。我是初学者。 最佳做法是什么?区别是什么?b/n如下所示: 一,

对2

Microsoft发布了一份报告,其中提供了我认为适用于您的问题的以下指南:

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

✓ 如果属性设置程序引发异常,请保留上一个值

避免从属性获取程序引发异常。属性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));
    }
}

除了第一个调用NullDateForMaxOrMinDate而第二个不调用之外,一个在setter中进行验证,另一个在getter中进行验证。你选择哪一个是一个意见问题,这就是为什么我投票关闭,虽然我更喜欢在二传中进行验证。这也是我在设置私有支持字段之前调用NullDateForMaxOrMinDate的地方。我同意结束意见请求,并且更喜欢在setter中进行验证。我不会使用静默重写,而是使用异常作为对错误的SoDadeTime的反应。这是一个不应该被忽视或默默修复的问题。我还想知道整个设计:SodaDateTime似乎是从DateTime派生的,并添加了2个字段-1个字符串和一个对您分配给它的类的引用?这是怎么回事?为什么ArgumentOutOfRangeException比ArgumentNullException更重要?@BlakeThingstad这是一个很好的观点。我不熟悉SodaDateTime类型,但是如果value==null,那么我肯定会使用ArgumentNullException。我更新了我的答案
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); }
}
// 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));
    }
}