根据CA1008规则,FXCop Enums的默认值应为零。这适用于C#吗?

时间:2013-09-16 09:59:23

标签: c# enums fxcop

此规则是否适用于C#?

如果我们尝试在没有明确设置值的情况下使用枚举,编译器会给出“使用未分配的局部变量”错误吗?

被问及的观点是FxCop规则的有效性,因为我无法使用枚举的默认值。

public enum TraceLevel
{
    Off = 0,
    Error = 1,
    Warning = 2,
    Info = 3,
    Verbose = 4
}

class Program
{
    static void Main(string[] args)
    {
        TraceLevel traceLevelOptions;
        Console.WriteLine(traceLevelOptions.ToString());
        Console.ReadLine();
    }
}

获得正确答案后更新。以下代码应该有效:

public class SerializeMe
{
    public int Id { get; set; }
    public TraceLevel MyTrace { get; set; }
}

public enum TraceLevel
{
    Off = 0,
    Error = 1,
    Warning = 2,
    Info = 3,
    Verbose = 4
}

class Program
{
    static void Main(string[] args)
    {
        SerializeMe serializeMe = new SerializeMe();
        Console.WriteLine(serializeMe.MyTrace.ToString());
        Console.ReadLine();
    }
}

2 个答案:

答案 0 :(得分:5)

枚举应该具有零值的原因在与其相关的代码分析错误的文档中进行了解释:

http://msdn.microsoft.com/en-us/library/ms182149.aspx

CA1008:枚举应为零值

未初始化枚举的默认值与其他值类型一样,为零。非标志属性枚举应该定义一个值为零的成员,以便默认值是枚举的有效值。

因此,原因是,例如,如果在类或结构中声明枚举字段并且不初始化它,则它将具有默认值零。如果枚举的成员没有零值,那么你(在相当常见的情况下)会有一个包含无效值的枚举字段。

还有一些其他情况可以使用默认初始化的枚举字段(例如在反序列化期间)。您希望避免默认初始化的枚举字段具有无效值,因此规则。

答案 1 :(得分:2)

这不是FXCop错误,它是C#编译器错误。在C#中,所有局部变量必须在使用前初始化。

TraceLevel traceLevelOptions = 0; // or TraceLevel.Error for example

与所有其他类型一样...如果traceLevelOptionsint,则会出现同样的错误。

struct类型存在漏洞。您可以为它们分配值或为其所有字段分配值,并将它们视为已分配。请注意,如果struct具有private字段,则有时无法满足此条件。