簡體   English   中英

根據CA1008的FXCop枚舉規則,默認值應為零。 這適用於C#嗎?

[英]As per CA1008 rule of FXCop Enums should have a default value of zero. Is this applicable for C#?

此規則是否適用於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字段,則有時無法滿足此條件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM