为了避免我可能会使用Google的所有标准答案,我将提供一个示例,您可以随意攻击。
C#和Java(和太多的人)有很多类型的一些“溢出”的行为我不喜欢在所有(如type.MaxValue + type.SmallestValue == type.MinValue
例如: int.MaxValue + 1 == int.MinValue
)。
但是,从我的恶毒天性来看,我会通过将这种行为扩展为“ Overridden” DateTime
类型来加重这种伤害。(我知道DateTime
它在.NET中是密封的,但是出于这个示例的缘故,我使用的伪语言与C#完全一样,但DateTime没有密封)。
覆盖的Add
方法:
/// <summary>
/// Increments this date with a timespan, but loops when
/// the maximum value for datetime is exceeded.
/// </summary>
/// <param name="ts">The timespan to (try to) add</param>
/// <returns>The Date, incremented with the given timespan.
/// If DateTime.MaxValue is exceeded, the sum wil 'overflow' and
/// continue from DateTime.MinValue.
/// </returns>
public DateTime override Add(TimeSpan ts)
{
try
{
return base.Add(ts);
}
catch (ArgumentOutOfRangeException nb)
{
// calculate how much the MaxValue is exceeded
// regular program flow
TimeSpan saldo = ts - (base.MaxValue - this);
return DateTime.MinValue.Add(saldo)
}
catch(Exception anyOther)
{
// 'real' exception handling.
}
}
当然,如果可以解决这个问题也很容易,但是事实仍然是,我只是看不到为什么不能使用异常(从逻辑上说,我可以看到,当性能成为问题时,在某些情况下应避免使用异常) )。
我认为在许多情况下,它们比if结构更清晰,并且不会破坏该方法制定的任何合同。
恕我直言,每个人似乎都没有“不使用它们进行正常的程序流程”反应,因为反应的强度可以证明是不够完善的。
还是我弄错了?
我读过其他文章,涉及各种特殊情况,但我要指出的是,如果你们俩都没错,那就是:
- 明确
- 履行您的方法合同
射死我
if
的语句。您会发现这很难。换句话说:您的前提是有缺陷的,因此您从中得出的结论是错误的。