Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么默认枚举值为0而不是最小值?_C#_Enums - Fatal编程技术网

C# 为什么默认枚举值为0而不是最小值?

C# 为什么默认枚举值为0而不是最小值?,c#,enums,C#,Enums,将“0”作为C#中枚举的默认值有什么意义?如果我声明的枚举以不同的数字开头: enum Color { Blue = 1, Green, Red, } 然后var color=default(color)-将返回我“0”。我希望看到的是最小值。如果枚举的每个成员都对应于某个特定的数字,并且“0”不是有效值,则此行为可能会导致问题。问题可能在于可能的正整数值较少 为什么不那么积极 能够正确处理带有位移位操作的枚举 我很自然地说的是默认值,它可以由开发人员更改。所有值类型(包括枚

将“0”作为C#中枚举的默认值有什么意义?如果我声明的枚举以不同的数字开头:

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"