关于枚举的简单问题

4
internal enum eCoinType 
{
    g = 0,
    h = 1,
    s = 2
}

我在同一段代码中看到了这行:

eCoinType coin = new eCoinType();  

这是什么意思?
在枚举中,“new”声明的作用是什么?谢谢。

3个回答

6

它使用默认值0创建一个eCoinType实例,该值对应于eCoinType.g。默认构造函数是System.Enum的构造函数。

请注意,虽然使用了关键字new,但您仍会创建值类型的项,因为枚举是值类型,而不是引用类型。这类似于使用new创建结构实例。


1
只是为了补充一下@BoltClock所说的,它将创建一个带有默认值的eCoinType,在数字类型的情况下,默认值为0,这是从enum派生出来的。因此,它相当于:
// These all mean the same thing
eCoinType coin = eCoinType.g;      // <-- This one is preferred, though
eCoinType coin = new eCoinType();
eCoinType coin = default(eCointType);
eCoinType coin = (eCoinType)0;

此外,eCoinType coin = default(eCoinType) - BoltClock

0

这是一种不好的态度。我曾经有程序员使用默认构造函数来创建枚举类型,这基本上会将枚举的第一个值赋值给它,而实际上程序员需要的是枚举类型的第一个值。请注意,有些人会向现有的枚举类型中添加值,而不关心顺序,如果他们将新值放在顶部,那么像这样编写的代码就会出现未定义的行为。

eCoinType cointype = new eCoinType();

在这种情况下等于

eCoinType cointype = eCoinType.g;

但是,如果您修改eCoinType并在g之前放置一些内容,则已更改应用程序逻辑。

也许有这样的用例(通过使用在不同插件模块中声明的枚举来修改应用程序逻辑?),但这与Visual Basic中的Shadows重载关键字一样晦涩难懂 :)


1
如果为每个枚举值明确定义了数值,那么顺序就不重要了。请参见此答案 - BoltClock
你说得完全正确,我忘记加上了。但是数字值很少被使用。 - Marino Šimić

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