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