根据 CA1008 规则,FXCop 枚举的默认值应为零.这是否适用于 C#
本文关键字:是否 适用于 默认值 规则 CA1008 FXCop 枚举 根据 | 更新日期: 2023-09-27 18:31:23
此规则是否应适用于 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();
}
}
枚举应
具有零值的原因在与之相关的代码分析错误的文档中进行了解释:
http://msdn.microsoft.com/en-us/library/ms182149.aspx
CA1008:枚举值应为零
与其他值类型一样,未初始化枚举的默认值为零。非标志属性枚举应定义值为零的成员,以便默认值是枚举的有效值。
因此,原因是,例如,如果您在类或结构中声明一个枚举字段并且不对其进行初始化,则该字段的默认值将为零。如果枚举中没有具有零值的成员,则在这种(相当常见)的情况下,您将拥有一个包含无效值的枚举字段。
还有其他情况下,您最终可能会得到默认初始化的枚举字段(例如,在反序列化期间)。您希望避免默认初始化的枚举字段具有无效值,因此规则。
这不是 FXCop 错误,而是 C# 编译器错误。在 C# 中,所有局部变量在使用之前都必须初始化。
TraceLevel traceLevelOptions = 0; // or TraceLevel.Error for example
像所有其他类型的一样...如果traceLevelOptions
是int
,你会得到同样的错误。
struct
类型存在漏洞。您可以为其分配值或为其所有字段分配值,它们将被视为已分配。请注意,如果struct
具有例如private
字段,则有时无法满足此条件。