如何防止枚举构造函数

时间:2017-12-13 09:47:23

标签: c# enums

我很惊讶,但是可以使用C#中的构造函数创建枚举。 例如,我有枚举:

public enum Color
{
    White = 1,
    Red = 2
}

然后可以像这样创建:

var color = new Color();

值为0,实际上是无效的枚举值。

那么,我们可以以某种方式禁止枚举构造函数吗?任何其他想法如何避免这种情况?

感谢。

3 个答案:

答案 0 :(得分:9)

  

那么,我们可以以某种方式禁止枚举构造函数吗?

没有。问题与构造函数本身并不严格相关:(Color)0也是有效的,因为基础类型的值可以为0

  

其他任何想法如何避免这种情况?

不,这基本上是一个更广泛的问题。防止这种情况的唯一方法是检查输入值的有效性。

根据Code Analysis,您应始终拥有0枚举值。

答案 1 :(得分:1)

一般来说,没有办法避免它。您可以使用静态分析器发出警告,但它不能解决枚举只是一个数字的基本问题,因此它可以具有值123.更常见的是它将具有零值(例如,如果您是新的,或者不指定它。)

要更清楚地看到问题,请考虑以下事项:

var colors = new Color[100];

现在colors[0]是什么?它是零,就像任何未初始化的数字一样。因此,枚举允许您为值赋予名称 - 它保证该类型的变量使用其中一个命名值。

一个好的最佳做法是在枚举中始终具有零值(通常在这种情况下,它将被称为“无”,“未初始化”,“未设置”或类似)。一旦你有了,那么未初始化的值将是有意义的。

答案 2 :(得分:1)

public enum Color实际上是枚举完整声明的缩写形式,即public enum Color : int

枚举总是具有底层基类型,从技术上讲,它只是该类型的变量。默认情况下,此类型为32位整数,这意味着可以将任何32位整数分配给此类枚举。

实际的枚举定义只是该类型的命名成员,便于在编程中使用,允许您更改甚至完全忽略基础值,而无需更改代码。

但在内部,你的类型Color的所有枚举(顺便说一句可怕的名字)只是Int32值,as Anders Forsgren pointed out和任何其他Int32值一样,它们在数组中默认为0任何类型的全局变量。这也是官方指南建议始终在您的枚举中添加0定义的原因。