C#使用int constants vs Enums而不使用强制转换

时间:2015-07-11 10:44:38

标签: c# enums

我有一些int常量分组在几个枚举中,如:

enum myEnum{ 
OBJECT_A = 10, OBJECT_B = 13 };

现在我有几个函数可以使用这个枚举并执行某些操作,例如:

void myfunc(myEnum e)
{ .... }

在我的代码中,我需要以这两种方式使用myfunc:

myfunc(myEnum.OBJECT_A);
myfunc(13);

这会产生错误,因为ints不会隐式转换为Enum。

您认为最佳做法是什么,以保持代码的可读性?

一个明显的解决方案是使用myfunc((myEnum)13);但这很无聊,因为每次都需要转换int并且代码变得很重。

到目前为止,我所做的是(完全避免使用枚举):

using EChannelInt = System.Int32;

public static class EChannel
{
    public static readonly int CH_CONNECTION        = 10;
    public static readonly int CH_DATA              = 50;
}

public void doit(EChannelInt ch)
{ .... }

doit(EChannel.CH_DATA);
doit(10);

哪个有效,但我不太喜欢它,因为它似乎是一个"技巧"或重命名thigs。你有什么建议?也许"隐含算子"可能有用吗?

4 个答案:

答案 0 :(得分:2)

您可以重载void myfunc(int i) { myfunc((myEnum)i); }

myFunc

答案 1 :(得分:1)

您可以使用type-safe-enum模式,并且可以覆盖隐式强制转换运算符。

public class EChannel
{
    public int Value {get; private set;};

    public static readonly EChannel CH_CONNECTION        = new EChannel(10);
    public static readonly EChannel CH_DATA              = new EChannel(50);

    private EChannel(int value)
    {
        Value = value;
    }

    public static implicit operator EChannel(int a)
    {
        EChannel eChannel = null;
        switch (a) // this need to be changed to something more light
        {
            case 10:
                eChannel = CH_CONNECTION;
                break;
            case 50:
                eChannel = CH_DATA;
                break;
            default:
                throw new Exception("Constant don't exists");
        }
        return eChannel;
    }
}

你就像这样使用它

public void doit(EChannel ch)
{ .... }

doit(EChannel.CH_DATA);
doit(10);

答案 2 :(得分:0)

过载怎么样?

numpy.ndarray

(如果您无法控制班级,可以extension method进行。)

答案 3 :(得分:0)

我会尽可能地使用枚举值,并且在绝对必要时(如果有的话)仅在狭窄的范围内强制转换为int

但是,如果你坚持混合整数和枚举值,那么你应该考虑从整数中定义enum成员,以保证它们是一致的。

示例:

public static class EChannel
{
    public const int CH_CONNECTION = 10;
}

public enum myEnum
{
    CH_CONNECTION = EChannel.CH_CONNECTION
}