在 C# 中,将'0'作为枚举的默认值有什么意义呢?如果我声明一个以不同数字开头的枚举:
enum Color
{
Blue = 1,
Green,
Red,
}
那么 var color = default(Color)
- 会返回 '0'。我希望看到的是最小值。如果枚举的每个成员都对应着某个特定的数字,而 '0' 不是一个有效值,这种行为可能会导致问题。
在 C# 中,将'0'作为枚举的默认值有什么意义呢?如果我声明一个以不同数字开头的枚举:
enum Color
{
Blue = 1,
Green,
Red,
}
那么 var color = default(Color)
- 会返回 '0'。我希望看到的是最小值。如果枚举的每个成员都对应着某个特定的数字,而 '0' 不是一个有效值,这种行为可能会导致问题。
DateTime.MinValue
是按位 0 - 不确定其中一个如何与另一个相反。 - Alexei Levenkov我们只能猜测.NET框架某个方面为什么会以特定的方式设计。为了提供最简洁的解释,我想强调一下MSDN文档中的这句话:
枚举是一组命名常量,其底层类型可以是任何整型,除了Char。如果没有显式声明底层类型,则使用Int32。
请注意,.NET枚举本质上是整型类型的扩展。 整型类型的默认值为0,因此合理地(尽管在您所示例的情况下有点不太方便)让枚举继承该行为。
null
。这就是在调试时要查找的内容。 - Dan J枚举类型有可能存在不存在的值,因此存在Enum.IsDefined方法。
枚举类型E的默认值是表达式(E)0所产生的值。
到目前为止,已经有多个答案表明,任何固定大小数据结构的“默认”值都是0。该结构内存的大小设置为零,这被认为是“默认值”。现在,如果您想为枚举定义自己的“默认”值,则有多种选项。最简单的方式是编写自己的函数以为您提供“最小有效枚举”。
private E GetDefaultEnum<E>()
{
return (E)(Enum.GetValues(typeof(E)).Cast<E>().Min<E>());
}
使用方法:
enum Color
{
Blue = 1,
Green,
Red,
}
Color defaultColor = GetDefaultEnum<Color>();
MessageBox.Show(defaultColor.ToString()); // "Blue"
void ProcessColor(Color c) {
if (c == 0)
throw new ArgumentException("Color is not set", "c");
//...
}
enum
默认是 int
类型。Enums 是我们程序源代码中可读性较好的整数类型,但当你的程序被编译后,不存在 enum
的概念,只有 int
。整数类型的默认值为 0。
以下是代码:
public enum test { One, Two, Three }
var x = test.One;
var y = 0;
在IL中变成了这样:
IL_0001: ldc.i4.0
IL_0002: stloc.0
IL_0003: ldc.i4.0
IL_0004: stloc.1
int
怎么可能有默认值为1(正如你所问的),而在其他情况下则没有呢?关键在于可能是拥有更少的正整数可能值。
为什么要更少的正整数?
为了能够正确地处理具有位移操作的枚举。
我自然而然地谈论默认值,这可以由开发人员更改。
我不确定为什么但是...
这里有关于C#枚举的文档:http://msdn.microsoft.com/en-us/library/sbbt4032.aspx
枚举器可以使用初始化程序来覆盖默认值,如下例所示。
enum Days {Sat=1, Sun, Mon, Tue, Wed, Thu, Fri};
在此枚举中,元素序列被强制从1开始而不是0。但是,建议包含一个具有0值的常量。有关更多信息,请参见枚举类型(C#编程指南)。
他们建议您始终包括一个占位符枚举值,该值对应于值0,否则可能会遇到问题。您可以将此枚举值命名为未定义(Undefined)
或默认(Default)
等名称。
正如我在评论中提到的,我的建议是完全不要为您的枚举使用值,除非您有非常好的理由这样做。如果需要,请遵循MSDN枚举类型编程指南