反转对象或用减号将其标记为负数
本文关键字:记为 对象 | 更新日期: 2023-09-27 18:33:30
是否可以反转对象或将其标记为负数?
这就是我想要实现的目标:
DateTime.Now.Add(-TimeUnits.Week)
这应该返回当前日期时间减去 7 天。
所以我必须在Add
方法中检测传递的对象是否为负数!
我看过一个Struct
但我对它们的经验太少了,无法判断这是否可能!目前,我有一个枚举,当然非常有限。我没有特别绑定到枚举,所以它可以是任何其他对象!
我的枚举TimeUnits
:
public enum TimeUnits
{
Once = 0,
Day = 1,
Week = 2,
Month = 3,
Quarter = 4,
Year = 5
}
我在DateTime
上有一个扩展方法,我想将对象传递给方法Add
如下所示:
private static DateTime? Add(this DateTime current, TimeUnits unitOfTime)
{
switch (unitOfTime)
{
case TimeUnits.Once:
return null;
case TimeUnits.Day:
return current.AddDays(1);
case TimeUnits.Week:
return current.AddDays(7);
case TimeUnits.Month:
return current.AddMonths(1);
case TimeUnits.Quarter:
return current.AddMonths(3);
case TimeUnits.Year:
return current.AddYears(1);
default:
throw new ArgumentOutOfRangeException("unitOfTime");
}
}
严格来说,枚举类型只不过是为数字定义命名常量的一种方式。换句话说:表达式-((int(TimeUnit.Week)
只是以人类更易读的方式编写文字-2
的另一种方式。
虽然从技术上讲,完全可以"否定"这样的值(因为它确实是编译器的整数),但你不应该这样做。从概念上讲,这是一个可怕的想法,它将完全滥用枚举的概念。- 使用简单的常量来执行您尝试的操作,或者,如果可能,定义一个Subtract()
方法。
将您的签名更改为:
private static DateTime? Add(this DateTime current, int units, TimeUnits unitOfTime)
其中units
是要添加到current
的unitOfTime
数。
这使得可以编写:
DateTime.Now.Add( 1, TimeUnits.Week); // add a week
DateTime.Now.Add( 42, TimeUnits.Week); // add multiple weeks
DateTime.Now.Add(- 1, TimeUnits.Week); // subtract a week
DateTime.Now.Add(-42, TimeUnits.Week); // subtract multiple weeks
DateTime.Now.Add( 0, TimeUnits.Week); // return `current`
//etc...
注意:或者,您可以将其声明为 double units
,但要注意浮点算术精度和 NaN 值。