【发布时间】:2009-11-06 10:04:20
【问题描述】:
这个问题在我脑海里已经有一段时间了,如果它看起来很主观,很抱歉。在数据对象的公共属性和构造函数中使用 bool 有一些缺点。以下面的代码为例。
使用布尔:
public class Room
{
public string Name { get; set; }
public bool Bookable { get; set; }
public Room(string name, bool bookable);
}
以及这个类的使用
Room r = new Room ("101", true);
这是适当的功能,但是还有另一种实现方式:
使用枚举:
public enum BookingStatus
{
Bookable,
NotBookable
}
public class Room
{
public string Name { get; set; }
public BookingStatus Bookable { get; set; }
public Room(string name, BookingStatus bookable);
}
以及这个类的使用
Room r = new Room ("101", BookingStatus.Bookable);
在我看来,这两者在功能上是相同的,但各有优缺点:
- 设置属性时,Enum 方法更加冗长(您可以仅从代码中推断出 enum 的用法)
- 可以扩展枚举以支持更多状态(对 API 特别有用)
- 枚举需要更多的输入(尽管大大减少了)
- 枚举不能在条件句中使用(即 if (r.bookable)),尽管我知道这很容易解决。
我是否遗漏了什么,完全不合时宜?我不知道为什么这让我如此烦恼,也许我太强迫症了!
【问题讨论】:
-
意见:这似乎不是最好的例子——如果这是一个真正的是/否问题,那么布尔值是合适的。尽管您应该根据约定正确命名您的属性(即“IsBookable”)——一个更好的例子是一个非是或否问题,例如性别或测量单位等——即使你只识别两个状态(英寸与厘米,或男性与女性),您应该使用枚举,因为这些绝对不是“是或否”问题(即使您可以将它们变成是/否问题,但它们不是,并且每个都可以扩展以支持更多州)。