我有一个枚举Days
,如下所示:
public enum Days
{
Sunday = 1,
Monday = 2,
Tuesday = 3,
Wednesday = 4,
Thursday = 5,
Friday = 6,
Saturday = 7,
}
我想为Hours
设置类似的枚举/对象,强制该值为int
和0
之间的23
,即看起来像:
public enum Hours
{
0,
1,
2,
3,
4,
5,
6,
7,
8,
9,
10,
11,
12,
13,
14,
15,
16,
17,
18,
19,
20,
21,
22,
23,
}
它只有一个int值而且没有标识符。现在我知道枚举不能像这样工作所以我不能使用枚举,但是有另一种方法我可以用这样的对象来完成吗?
答案 0 :(得分:1)
如果你真的不想使用datetime,那么你的下一个最好的事情就是使用带有一些隐式转换的结构
function drawRed(ctx, x, y, rad) {
ctx.save();
ctx.fillStyle = 'red';
ctx.translate(x, y);
ctx.beginPath();
ctx.arc(0, 0, rad, 0, 2*Math.PI , false);
ctx.fill();
ctx.fillStyle = '#A00';
ctx.fillRect(-4, -4, 8, 8);
ctx.restore();
}
隐式运算符允许您在大多数时间将对象视为int,而validate函数确保您始终具有有效值。
所以你应该可以做public struct Hour
{
private int val;
public Hour(int val)
{
validate(val);
this.val = val;
}
private static void validate(int hour)
{
if (hour < 0 || hour > 23)
throw new Exception("it broke");
}
public static implicit operator int(Hour h)
{
return h.val;
}
public static implicit operator Hour(int d)
{
return new Hour(d);
}
}
和Hour h = 23;
但不能int time = h;
答案 1 :(得分:1)
枚举实际上并不强制该值为给定值之一。例如,即使你有这样的枚举:
public enum Numbers
{
Zero = 0,
One = 1,
Two = 2
}
以下仍被视为合法语法:
Numbers n = (Numbers)3;
相反,您应该做的是为Hours
字段创建一个属性并验证输入,以便在给定值不在允许范围内时抛出异常:
private int _hours;
public int Hours
{
get { return _hours; }
set
{
if (value < 0 || value > 23)
throw new ArgumentOutOfRangeException(nameof(Hours), "The value must be between 0 and 23");
_hours = value;
}
}
话虽这么说,你正在使用的是一天一小时(大概是几分钟或几秒或几个月),所以DateTime
对象已经拥有你需要的所有功能。
private DateTime _dt;
public int Days
{
get { return _dt.Day; }
set { _dt = new DateTime(_dt.Year, _dt.Month, value, _dt.Hour, _dt.Minute, _dt.Second, _dt.Millisecond); }
}
public int Hours
{
get { return _dt.Hour; }
set { _dt = new DateTime(_dt.Year, _dt.Month, _dt.Day, value, _dt.Minute, _dt.Second, _dt.Millisecond); }
}
答案 2 :(得分:1)
我会在二传手中检查:
private int hour;
public int Hour
{
get { return hour; }
set
{
if (value < 0 || value > 23)
throw new ArgumentOutOfRangeException();
hour = value;
}
}
答案 3 :(得分:0)
您可以为每个数字创建一个包含单词的枚举,也可以创建一个长度为24的数组,其中每个索引的值等于索引。
例如:
enum
{
Zero = 0,
One,
Two
}
var days = int[24] { 0, 1, 2, ..., 22, 23 };
days[0]; // == 0