【问题标题】:using an enum when a class already exists for it?当一个类已经存在时使用枚举?
【发布时间】:2012-11-01 16:13:54
【问题描述】:

我有一个类定义如下:

public class Category
{
    public int Id {get; set;}
    public string Name {get; set;}

    //... additional properties ...
}

我的数据库中有大约 10 个类别,并且该集合在未来不太可能发生变化(尽管可能会偶尔添加新类别)。每个类别都有许多与之关联的字段。

在大多数情况下,其他类仅填充类别的Id。我需要根据具体类别执行不同的操作。

例如:

if (categoryId == 1)
{
    //do something
}
else
{
    //do something else
}

我希望在执行此操作时避免硬编码值。

我通常会为此使用枚举,但我不确定在这种情况下如何构造它,因为我已经为它准备了一个类。一个想法是创建一个名为CategoryEnum 的单独枚举,但这看起来很臭。另一种选择是使用类常量。

将类别Id 与特定常量值进行比较的最清晰方法是什么?

【问题讨论】:

  • 什么是类别? categoryID 1 代表什么?

标签: c# enums constants


【解决方案1】:

如果我正确理解问题,这应该是一个有效的实现。

if(categoryId == (int)Category.CategoryOne)
{
 ...
}
else 
{
  ...
}

【讨论】:

  • 澄清一下:您是在建议使用类常量?
  • 是的,这几乎是我们每次都这样做的方式
【解决方案2】:

这个呢:

public enum CategoryId { ... }

public class Category
{
    public CategoryId Id {get; set;}
    public string Name {get; set;}

    //... additional properties ...
}

枚举描述了 ID,而你的类的其余部分添加了其他有用的信息。


如果您想将其保留为 int 属性,您仍然可以使用枚举:

public enum CategoryId { ... }

public class Category
{
    public int Id {get; set;}
    public string Name {get; set;}

    //... additional properties ...
}

那么当你需要测试值时:

switch ((CategoryId)myCategory.Id)
{ ... }

【讨论】:

  • 我不希望更改 Id 字段的现有实现,因为它与数据库的 PK 相关联并且在许多其他地方使用。
  • @RyanKohn 默认情况下,enum 真的是int,所以它本质上没有什么不同。请注意,您可以保持原样并仍然使用枚举。我会编辑...
【解决方案3】:

根据 Antarr Byrd 的 response,似乎使用类常量可以实现最清晰的代码。

public class Category
{
    public const int CATEGORY_ONE = 1;
    public const int CATEGORY_TWO = 2;
    //etc.

    public int Id {get; set;}
    public string Name {get; set;}

    //... additional properties ...
}

为了比较:

if (categoryId == Category.CATEGORY_ONE)
{
    //do stuff
}

【讨论】:

    猜你喜欢
    • 2020-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多