【问题标题】:How to alias enum name and enum values in C#? Intended use is improving code readability如何在 C# 中为枚举名称和枚举值取别名?预期用途是提高代码可读性
【发布时间】:2022-01-20 07:27:34
【问题描述】:

上下文

我将花费相当长的时间使用 C# API。使用此 API 将意味着非常频繁地使用该 API 中的一小组enum(值的数量在数百范围内)。这些enum在代码中随处可见。

我不喜欢这些 enum 的命名,因为我发现它们给编写的代码添加了很多噪音。它们使用以下模板命名:

SoftwareNameNameOfTheKindOfEnum.SoftwareNameNameOfTheKindOfEnumKindOfValue

稍作修改但非常相似的示例是:

YZBuiltInCategoryKinds.YZBuiltInCategoryKindsOtherCategory

一个枚举值很容易占用 50 到 60 个字符,我发现在代码中使用它们时很难阅读。

我宁愿阅读一些东西:

NameOfTheKindOfEnum.KindOfValue

上面的例子会给出:

CategoryKind.OtherCategory

问题: 如何在 C# 中为enum 制作别名,不仅为enum 类型名称取别名,还为enum 值名称取别名。使用using 指令很容易为类型名称起别名,但它不会影响enum 值名称。

【问题讨论】:

    标签: c# enums


    【解决方案1】:

    编辑感谢@MarcGravell 评论,将static readonly 替换为const

    我找到的一个解决方案是创建一组const 变量存储在static 类中,每个enum 一个,例如:

    public static class CategoryKind
    {
        public const YZBuiltInCategoryKinds OtherCategory = YZBuiltInCategoryKinds.YZBuiltInCategoryKindsOtherCategory,
        // etc... add as many readonly variables as there is values for this `enum`
    }
    

    使用这些静态类,代码如下:

    var myProperty = new Property(YZBuiltInPropertyTypes.YZBuiltInPropertyTypesInteger, 10, YZBuiltInCategoryKinds.YZBuiltInCategoryKindsOtherCategory);
    

    会变成

    var myProperty = new Property(PropertyType.Int, 10, CategoryKind.OtherCategory);
    

    【讨论】:

    • 注意:const 可能比 readonly 更可取 - 然后它会直接烧入消费者,而不是静态字段查找(JIT 可能仍然减少对内联 const 的静态只读字段查找,但它可能不会 - 取决于框架版本)
    • 如果你做了这样的事情,你还不如自己做枚举;枚举毕竟是常量,你可以用原始枚举值初始化它。虽然我猜想,如果它们不只是用作int,您需要将其转换为将其传递给期望原始枚举类型的函数......
    • @MarcGravell 谢谢,你是对的,我会编辑答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-21
    • 1970-01-01
    • 2012-05-14
    • 1970-01-01
    • 2012-12-28
    相关资源
    最近更新 更多