C# 为什么默认枚举值为0而不是最小值?
将“0”作为C#中枚举的默认值有什么意义?如果我声明的枚举以不同的数字开头:C# 为什么默认枚举值为0而不是最小值?,c#,enums,C#,Enums,将“0”作为C#中枚举的默认值有什么意义?如果我声明的枚举以不同的数字开头: enum Color { Blue = 1, Green, Red, } 然后var color=default(color)-将返回我“0”。我希望看到的是最小值。如果枚举的每个成员都对应于某个特定的数字,并且“0”不是有效值,则此行为可能会导致问题。问题可能在于可能的正整数值较少 为什么不那么积极 能够正确处理带有位移位操作的枚举 我很自然地说的是默认值,它可以由开发人员更改。所有值类型(包括枚
enum Color
{
Blue = 1,
Green,
Red,
}
然后var color=default(color)
-将返回我“0”。我希望看到的是最小值。如果枚举的每个成员都对应于某个特定的数字,并且“0”不是有效值,则此行为可能会导致问题。问题可能在于可能的正整数值较少
为什么不那么积极
能够正确处理带有位移位操作的枚举
我很自然地说的是默认值,它可以由开发人员更改。所有值类型(包括枚举)的默认值都是按位0。因此,这意味着0始终是枚举的可能值,即使它没有显式定义 规格如下: 编辑:有关详细信息,请查看MSDN中的枚举类型- 枚举是一种特殊的类型,它从其他值类型(通常不可能)派生而来,但表现为其支持类型的值类型。枚举只能使用一些整数值作为支持类型
注意:@archil指出,枚举值可以包含任何支持类型的值,而与枚举本身中枚举的常量列表无关。对于标记为“FlagsAttribute”的枚举,通常会出现这种行为,但对于普通枚举,这种行为可能并不直观。枚举总是可能不存在值。这就是存在的原因 枚举E的默认值是表达式生成的值 (E) 0
我们只能猜测为什么.NET框架的某个方面是以某种方式设计的。为了得到最直接的解释,我想强调以下几点: 枚举是一组基础类型为的命名常量 除Char之外的任何整数类型。如果没有显式指定基础类型 声明,则使用Int32 请注意,.NET枚举本质上是整型的扩展。整数类型的默认值为0,因此枚举继承该行为是合理的(如果在您所演示的情况下有点不方便的话)。我不知道为什么,但是 以下是关于C#enum的文档: 枚举数可以使用初始值设定项覆盖默认值,如下例所示 枚举日{星期六=1,星期一,星期二,星期三,星期四,星期五} 在此枚举中,元素序列强制从1开始,而不是从0开始。但是,建议包含一个值为0的常量。有关详细信息 他们建议您始终包含与值0对应的占位符枚举值,否则可能会遇到问题。您可以将此枚举值命名为
Undefined
或Default
之类的名称
不过,正如我在对您的问题的评论中所提到的,我的建议是,除非您有很好的理由这样做,否则不要对枚举使用值。如果需要,请按照说明为什么0是默认枚举值?易于运行时实现。任何值类型的默认值都是按位0,可能空引用由按位0表示。因此,要使用默认值初步构建对象,我们只需要知道其大小;运行时不需要知道或处理有关对象结构的任何信息。类似地,预定义的值类型构造函数只能用零填充内存范围 不管你喜不喜欢,事情就是这样。作为回应,我们需要做的是在设计枚举时,无论名称是合适的默认名称,都将其值设为0。如果没有合适的默认值,那么接受此类枚举作为参数的方法可能会检查其设置是否正确,例如:
void ProcessColor(Color c) {
if (c == 0)
throw new ArgumentException("Color is not set", "c");
//...
}
enum
是int
(默认情况下)。对于我们的源代码,枚举是人类可读的整数,但是当您的程序被编译时,没有enum
,只有int
s。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(如您所问),而在其他情况下却不是呢?正如在多个答案中所述,任何固定大小的数据结构的“默认”值都是0。结构内存的大小设置为零,这被视为“默认”。现在,如果要为枚举定义自己的“默认”值,可以有多个选项。最简单的方法是编写自己的函数,为您提供“最小有效枚举”
private E GetDefaultEnum()
{
返回(E)(Enum.GetValues(typeof(E)).Cast().Min());
}
用法:
enum Color
{
Blue = 1,
Green,
Red,
}
Color defaultColor = GetDefaultEnum<Color>();
MessageBox.Show(defaultColor.ToString()); // "Blue"
枚举颜色
{
蓝色=1,
绿色
红色
}
Color defaultColor=GetDefaultEnum();
MessageBox.Show(defaultColor.ToString());//“蓝色”
显然,您可以改变确定“默认”值的方式,但这种方式似乎最适合您的需要。为什么选择“最小值”?为什么没有倒计时的枚举?为什么要从0以外的任何值开始?大多数程序员习惯于在计数时使用0作为起点,例如在处理数组时。我建议不要给你的枚举值,除非你有很好的理由这么做。@JesseWebb这是一个例子。但我可以声明枚举,其中每个成员都持有一些特定的值。最近,我处理了某种格式的文件,其中每个条目都由1、2或3个标记值定义。@JesseWebb有时与外部进程的兼容性使外部进程的显式数值更容易映射到.net应用程序内的可编辑句柄。如果您处理的旧系统返回的值介于8和27之间(因为0..7在8年前就已被弃用),则可以更轻松地将这些值以数字形式映射到枚举值。(虽然是的,但在一般情况下,这种情况不应该发生。)
enum Color
{
Blue = 1,
Green,
Red,
}
Color defaultColor = GetDefaultEnum<Color>();
MessageBox.Show(defaultColor.ToString()); // "Blue"