在C#中,是否有一种方法可以同时定义一个枚举和该枚举的实例?

9

我是一个有用的助手,可以帮您进行翻译。

需要优化C#代码以定义枚举并同时创建该枚举类型的变量:

之前的代码:

    enum State {State1, State2, State3};
    State state = State.State1;

之后(无法工作):

    enum State {State1, State2, State3} state;
    state = State.State1;

有类似的东西吗?


即使有这样的方法,它也不会更加优化。enum State {State1, State2, State3}在运行时不会产生任何成本。 - Gavi Lock
5个回答

9

在C#中没有对此的支持,但如果您只需要切换一些状态且不需要执行任何特殊操作,则可以通过使用元组或匿名类型来解决这个问题,并实现与枚举“接近”的功能。

例如,使用元组,您可以这样做:

var someFakeEnum = Tuple.Create(0, 1);

更新

C# 7引入了语法元组:

var someFakeEnum = (State1: 0, State2: 1);

或者使用匿名类型:

var someFakeEnum = new { State1 = 0, State2 = 1 };

之后,您可以这样做:

int state = 0;

// If you're using tuples...
if(some condition)
{
    state = someFakeEnum.Item2;
}

// ...or if you're using anonymous types or C# >= 7 tuples...
if(some condition) 
{
    state = someFakeEnum.State2;
}

显然这不是真正的枚举类型,因此您没有Enum类型提供的语法糖,但您仍然可以像使用其他实际枚举一样使用二进制运算符,如OR、AND或条件语句。


它对于switch不起作用,因为它不是常量。另外var someFakeEnum = { State1 = 0, State2 = 1 };也不起作用,需要加上一个new - Haocheng
@Haocheng 已修复。我移除了 switch 部分,那是错误的。 - Matías Fidemraizer

6

这不是一种优化。

不,这样的东西不存在,有很好的理由。这样会使代码可读性降低很多,并且绝对没有任何好处。将它们分别声明为两个语句并完成它。

如果你真的被要求缩减源代码中的行数,可以像这样编写:

enum State {State1, State2, State 3}; State state = State.State1;

(是的,这只是个玩笑。大部分是这样的。)


4
我想知道我在给初学者程序员建议时使用讽刺语气会间接产生多少糟糕的代码。 - Dyppl
3
内联枚举在枚举使用非常有限的情况下非常有用,例如用于定义方法参数,在这种情况下它仅接受少量状态,并且真正没有必要在您的命名空间中拥有专用枚举类型。这在C# 6.0中可以更好地实现,简化了静态成员的使用。 - orad

3

你是从C/C++转过来的吗?

不,不能这样做。


1

不存在这样的东西。在我看来,它也不是很易读。


我在C/C++中从未遇到过问题。但在C#中,它看起来有些不寻常。 - Dyppl

0
在C#中,类型的声明和使用该类型来声明变量是分开的。
在C / C ++中,通常直接声明和使用类型,例如使用struct关键字。在C#中,它们是分开的。
请注意,在C#中,声明枚举(或类或结构)后不需要分号:
enum State { State1, State2, State3 }

虽然这仍然被允许,但大概是为了更兼容 C/C++ 语法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接