C#中的枚举可以为空吗

时间:2019-01-08 10:07:12

标签: c# enums http-status-codes

只是想知道enum在C#中是否可以为空?

特别是我对C#中HttpStatusCode的{​​{1}}实现感兴趣。

如果我不为enum的变量赋值会怎样?  类型?如果我尝试分配一个不期望的值会怎样?

3 个答案:

答案 0 :(得分:3)

来自MSDN

  

每个枚举类型都有一个基础类型,它可以是除char以外的任何整数类型。枚举元素的默认基础类型为int。要声明其他整数类型的枚举(例如字节),请在标识符后跟该类型后使用冒号,如以下示例所示。   C#

     

枚举日:字节{Sat = 1,星期日,星期一,星期二,星期三,星期四,星期五};

     

枚举的批准类型为byte,sbyte,short,ushort,int,uint,long或ulong。

由于这些仅是值类型,因此枚举本身不能为null

当然,您可以将其包装在Nullable中,这允许值类型表现为“可为空”,但是从技术上讲,Nullable<T>是通用的结构类型(不可为空),而不是枚举本身,按照定义,它只是一个包装器:

public struct Nullable<T> where T : struct

您可能想知道:如何构造一个nullSee this answer for an explanation

  

Nullable<bool> b = new Nullable<bool>();

基本上,它永远不会null。这是一种编译器技巧,可以保证诸如HasValue之类的值始终可用。

答案 1 :(得分:3)

HttpStatusCodes枚举

关于您对HttpStatusCodes的特定疑问。

实际上发生的是诸如“ StatusCodes.400NotFound”这样的“对代码阅读器友好的”枚举只是400整数值的表示。您可以根据需要手动使用整数值作为参数,但是其他人在读取您的代码时可能无法理解HTTP状态代码。

  

例如,如果我只是在代码中编写了状态代码422,是否易于阅读/理解?可能不是一个好主意。如果您使用StatusCode.422UnprocessableEntity,则阅读代码的人会有更好的机会。

有效的HTTP状态代码是什么?
如果要发回HTTP响应,则可以指定此处列出的任何整数值... https://en.wikipedia.org/wiki/List_of_HTTP_status_codes

未指定或默认的行为?
在不知道您使用什么方法或使用什么服务器的情况下,有关“如果未分配它会发生什么”的问题。通常的答案是,服务器将默认以200(OK)状态码进行响应。

使用非标准响应代码
这实际上取决于您在做什么,但是使用不属于标准(例如-999)的响应代码值可能会(或可能不会)出现错误,但应避免这种情况,因为它不是受支持的标准。

可空枚举

对于所有情况下的HttpStatusCodes(根据我的经验),您不能null的值分配给HttpResponse,因为属性类型是整数。

请注意,我的意思是将状态代码值分配给HttpResponse对象。您可以阅读有关可为空的枚举的一般问题的其他答案。

答案 2 :(得分:2)

除非您将变量设为Nullable<MyEnum>(或MyEnum?)类型,否则不要。

在幕后,枚举是整数。枚举未初始化时,其值为default(int),即0

编辑:其他基础类型也是可能的,但是默认类型为int。无论使用哪种基础类型,未初始化的枚举始终将是基础类型的默认值。

当您不为枚举分配整数值时,第一个选项将设置为0,因此是默认选项。

public enum MyEnum { Foo, Bar, Baz }

MyEnum myEnum;

if(myEnum == MyEnum.Foo) //true 
if(myEnum == MyEnum.Bar) //false
if(myEnum == MyEnum.Baz) //false

当您确实将整数值分配给枚举并且没有0(或未分配)值时,那么您未初始化的枚举将不匹配任何选项。

public enum MyEnum { Foo = 1, Bar = 2, Baz = 3 }

MyEnum myEnum;

if(myEnum == MyEnum.Foo) //false
if(myEnum == MyEnum.Bar) //false
if(myEnum == MyEnum.Baz) //false