CA1800的解释:不要不必要地投射'需要

时间:2015-04-02 13:54:10

标签: c# code-analysis

我对Visual Studio中的代码分析警告有点困惑。以下代码提出了它:

static void Main(string[] args)
{
    var something = new Something();
    object expression = "Any value";
    for (int i = 0; i < 2; i++)
    {
        switch (i)
        {
            case 0:
                something.Help = expression as string;
                break;

            case 1:
                something.Description = expression as string;
                break;
        }
    }
}

class Something
{
    public string Help;
    public string Description;
}

documentation of CA1800说:

  

...重复演员表会降低演奏效果,尤其是演员阵容时   在紧凑的迭代语句中执行。对于显式重复   转换操作,将转换结果存储在局部变量中   使用局部变量而不是重复的强制转换操作。 ...

我可以使用并分配一个局部变量,是的。但是上面显示的强制转换不会在一次迭代中执行。因此,在我看来,这不比使用局部变量更昂贵。

在我的实际方法中,变量expression可以包含许多其他类型以及其他类型的类Something属性。还有一个其他参数,它取代了i,而且没有for-loop

假设我为任何可能类型的expression创建一个局部变量。然后将执行许多演员操作,而只需要一个。

for (int i = 0; i < 2; i++)
{
    var type1 = expression as Type1;
    var type2 = expression as Type2;
    var type3 = expression as Type3;
    var type4 = expression as Type4;
    switch (i)
    {
        case 0:
            something.*** = type1;
            break;

        case 1:
            something.*** = type2;
            break;

        ...
    }
}

这很贵......

有人可以告诉我这个警告的背景吗?这对我没有任何意义。

1 个答案:

答案 0 :(得分:3)

警告表示您因循环而多次重建。这应解决它:

var something = new Something();
object expression = "Any value";
string expressionAsString = expression as string;
for (int i = 0; i < 2; i++)
{
    switch (i)
    {
        case 0:
            something.Help = expressionAsString;
            break;

        case 1:
            something.Description = expressionAsString;
            break;
    }
}

那就是说,正如Servy提到的警告是警告 - 如果您的代码更容易理解多个演员和它不会显着影响性能(这只能通过尝试来确定)两种方式并测量差异)然后忽略或抑制警告。我已经看到太多代码难以理解和/或难以理解,只是为了避免不理解代码上下文的警告