只是想知道enum
在C#中是否可以为空?
特别是我对C#中HttpStatusCode
的{{1}}实现感兴趣。
如果我不为enum
的变量赋值会怎样?
类型?如果我尝试分配一个不期望的值会怎样?
答案 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
您可能想知道:如何构造一个null
? See this answer for an explanation:
Nullable<bool> b = new Nullable<bool>();
基本上,它永远不会null
。这是一种编译器技巧,可以保证诸如HasValue
之类的值始终可用。
答案 1 :(得分:3)
关于您对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