我有一个属性是enum的类
枚举是
/// <summary>
/// All available delivery actions
/// </summary>
public enum EnumDeliveryAction
{
/// <summary>
/// Tasks with email delivery action will be emailed
/// </summary>
Email,
/// <summary>
/// Tasks with SharePoint delivery action
/// </summary>
SharePoint
}
Run Code Online (Sandbox Code Playgroud)
当我在代码中创建此类的实例NOWHERE时,我是否指定枚举字段的值,但它似乎默认为枚举列表中的第一项,而不是空值,这是枚举的工作原理吗?如果枚举没有设置,如何确保枚举得到某种空值,我不希望它默认为枚举中的第一个值.
Meh*_*ari 110
enum类型的默认值是0(默认情况下,枚举中的第一个元素).类的字段将初始化为默认值.
如果需要在枚举中表示未知值,则可以添加Unknown值为0 的元素.或者,可以将该字段声明为Nullable<MyEnum>(MyEnum?).
Jos*_*off 10
枚举是一种值类型,如整数.您需要使其可为空,以便不默认为第一个(或0定义的)枚举成员.
public class MyClass
{
public EnumDeliveryAction? DeliveryAction { get; set;}
}
Run Code Online (Sandbox Code Playgroud)
枚举字段初始化为零; 一,如果你不枚举指定的值,便开始在零(Email = 0,SharePoint=1,等).
因此,默认情况下,您自己初始化的任何字段都将是Email.None=0为这种情况添加或者使用是相对常见的Nullable<T>; 即
/// <summary>
/// All available delivery actions
/// </summary>
public enum EnumDeliveryAction
{
/// <summary>
/// Not specified
/// </summary>
None,
/// <summary>
/// Tasks with email delivery action will be emailed
/// </summary>
Email,
/// <summary>
/// Tasks with SharePoint delivery action
/// </summary>
SharePoint
}
Run Code Online (Sandbox Code Playgroud)
您还应该确保永远不会将您的上一个预期值视为默认值; 即
switch(action) {
case EnumDeliveryAction.Email; RunEmail(); break;
default: RunSharePoint(); break;
}
Run Code Online (Sandbox Code Playgroud)
这应该是:
switch(action) {
case EnumDeliveryAction.Email; RunEmail(); break;
case EnumDeliveryAction.SharePoint; RunSharePoint(); break;
default: throw new InvalidOperationException(
"Unexpected action: " + action);
}
Run Code Online (Sandbox Code Playgroud)
最佳实践(如代码分析所建议)是在枚举中始终具有默认值,表示未设置的值.
所以在你的情况下,你可能有:
public enum EnumDeliveryAction
{
/// <summary>
/// Default value
/// </summary>
NotSet,
/// <summary>
/// Tasks with email delivery action will be emailed
/// </summary>
Email,
/// <summary>
/// Tasks with SharePoint delivery action
/// </summary>
SharePoint
}
Run Code Online (Sandbox Code Playgroud)
顺便说一句,你不应该在枚举的名称前加上Enum.您可以考虑更改为:
public enum DeliveryAction;
Run Code Online (Sandbox Code Playgroud)
枚举是值类型。值类型不能为null,并且必须初始化为0。
即使您的枚举不为0,枚举变量也会被初始化为0。
public enum SomeEnum
{
A = 1,
B = 2
}
Run Code Online (Sandbox Code Playgroud)
(后来)
SomeEnum x = default(SomeEnum);
Console.WriteLine(x);
Run Code Online (Sandbox Code Playgroud)
输出-0
一些答复者主张使用Nullable<T>来满足您的初始化期望。请谨慎使用此建议,因为Nullable<T>它仍然是值类型,并且语义与引用类型不同。例如,它将永远不会生成空引用异常(它不是引用)。
SomeEnum? x = default(SomeEnum?);
if (x == null)
{
Console.WriteLine("It's null!");
}
if (x > SomeEnum.B)
{
}
else
{
Console.WriteLine("This runs even though you don't expect it to");
}
Run Code Online (Sandbox Code Playgroud)