在我们的数据库中,有一个名为ObjectType的表。该表只是包含了一系列带有Id和ObjectName的行。在我们的后端代码中,我们以不同的方式处理不同的对象,因此经常需要引用对象的ID进行比较。这些ID始终相同,并且它们始终映射到相同的对象。
如果我的方法期望传递一个整数值,那么哪种结构体对于处理这些对象更好?
何时使用结构体?何时使用枚举?
如果我的方法期望传递一个整数值,那么哪种结构体对于处理这些对象更好?
何时使用结构体?何时使用枚举?
枚举类型不能与结构体互换使用,它们拥有完全不同的用途。 结构体可以有成员和方法,而枚举只能有标签和标签的值。
你可以使用枚举类型来指定系统的不同行为。
假设你有一个名为Person的类,并且出于某种原因人可以有情绪状态。
一个好的实现方式是使用以下枚举类型:
enum EmotionalState
{
Happy = 3,
Sad,
Shy
}
你可以像这样将枚举项用作整数:
int b = (int)EmotionalState.Sad // <---4
而且也可以在反向方向进行
int v = 3;
EmotionalState s = (EmotionalState)v; // Happy
请注意,枚举成员没有类型。它们也可以被指定一个起始值。例如,如果您在第一项上分配3,则下一项将被标记为4。struct Point {
int a;
int b;
}
结构体应该尽可能小,因为它们是值类型并且存储在堆栈上,而引用类型存储在堆上。
var someVar = ObjectType.Role
,我就可以将一个整数值分配给someVar
。这也会使我的代码更易读,因为我不会说if (objectType == 15) { }
。我只需要确保分配给变量的值在我使用数字Id进行多次插入/查询时仍然容易访问。过去,我曾使用具有静态定义值或常量的结构体。 - JD Davisstruct
并不是enum
的替代品,它是class
的替代品。在结构体和类中,只有内存布局不同。
如果您不需要让代码跟随并支持添加到数据库中的新条目,则可以选择使用枚举类型。
否则,如果您需要支持新的数据库条目,则应考虑使用Dictionary<int, string>
。
枚举是一组可供选择的不同选项列表,结构体用于存储变量(它类似于类,但主要用于仅存储数据)。
enum Sports {
Soccer, Tennis, Football, Baseball
}
输出结果为:体育。
| 足球 |
| 网球 |
| 足球 |
| 棒球 |
ObjectType
表读入到一个 Dictionary<string, int>
中。将 id
与 ObjectName
进行映射。对于那些期望 int 类型的方法,你可以传递 objectTypeMapping["objectName"]
。ObjectType
表相当小且完全静态。一旦在代码中定义,我只想调用类似于 ObjectType.User
的东西并返回一个整数值。 - JD Davis